原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】DOTweenを使ってTextMeshの文字を動かす

台風

毎年のように発生する数十年に一度の巨大台風が今年もやって来て、窓ガラスに養生テープを張り、食料品の買いだめやらアレコレと準備をしたけど何事もなかった皆さんこんにちは。災害は心配し過ぎるぐらいが丁度いいですね。

 

TextMeshとDOTween

元々DOTween(Pro版のみ)にはTextMeshに対するTweenのメソッドが用意されていましたが、それらはText全体に対するアニメ動作を実装するもので、Textを1文字ずつ個別にアニメーションさせることはできませんでした。

しかし、最近のアップデートで文字個別に対するTweenのメソッドが実装されました。(Pro版のみ)

 

これは従来のTextMeshに対するTweenメソッドが拡張された(追加)というよりは、TextMeshをラップしたクラスを生成し、それに対してTweenを行う方式で実装されています。

このTextMeshをラップするクラスがDOTweenTMPAnimatorクラスです。

 

DOTweenTMPAnimator

前述のようにTextMeshの文字を個別にTweenさせるには、対象となるTextMeshをラップしたDOTweenTMPAnimatorクラスに対してメソッドを発行して行います。

 

TextMeshProUGUI MyTextMesh;

public void OnClick_Color()
{
    MyTextMesh.text = "Stab of Bee Project";

    // DOTweenTMPAnimatorの生成
    DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
    textAnim.DOColorChar(0, Color.red, 2f);
    textAnim.DOColorChar(8, Color.red, 2f).SetDelay(0.3f);
    textAnim.DOColorChar(12, Color.red, 2f).SetDelay(0.6f);
}

 

上のソースの場合、MyTextMeshの0,8,12桁目の文字を赤色に変化させています。
また、順に変化させるためにSetDelayで8,12桁目には遅延が発生するように設定しています。

f:id:Karvan:20200908213720g:plain

 

個別に桁数をせずにforループを使用したい場合はtextInfo.characterCountを使うと文字数が取得できます。
よって、前から順に赤色に変化させたい場合はこんな感じのソースになります。

 

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOColorChar(iCnt, Color.red, 2.0f).SetDelay(0.1f * iCnt);
}

f:id:Karvan:20200908213837g:plain

 

その他のメソッド

色を変えるだけでなく他にも色々なメソッドが用意されています。 

DOTweenの公式のDocumentの「TextMeshPro per-character animation」の項目を見ると

 

  • DOFadeChar
  • DOColorChar
  • DOOffsetChar
  • DORotateChar
  • DOScaleChar
  • DOPunchCharOffset
  • DOPunchCharRotation
  • DOPunchCharScale
  • DOShakeCharOffsetadeOut
  • DOShakeCharRotation
  • DOShakeCharScale
  • SkewSpanX
  • SkewSpanYwRight
  • ResetVerticesShift
  • SetCharColor
  • SetCharOffset
  • SetCharRotation
  • SetCharScale
  • ShiftCharVerticeshtShift
  • SkewCharX
  • SkewCharY

これだけのメソッドがあります。代表的なものを紹介すると

 

■DOOffsetChar

文字のOffset値を変えることで文字を平行移動させることができます。
例えば文字を順に上へ移動させる場合は

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOOffsetChar(iCnt, Vector3.up * 30.0f, 1.0f).SetDelay(0.1f * iCnt);
}

f:id:Karvan:20200908214716g:plain

他にも、Rotate(回転)、Scale(拡大縮小)など通常GameObjectに対するTweenと同じ様なメソッドもあります。

 

 ■DOPunchCharOffset

ゲーム内のUIとして使用するならPuch系のメソッドの方が使い勝手が良いかと思います。

Puch系とは同じアニメ動作を減衰しながら繰り返してくれる動作で、最後には開始位置に戻ってきて来れます。

先程のDOOffsetCharをDOPunchCharOffsetに変えた場合

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOPunchCharOffset(iCnt, Vector3.up * 30.0f, 1.0f, 1).SetDelay(0.1f * iCnt);
}

f:id:Karvan:20200908215057g:plain

第四引数は振動回数を指定します(未設定の場合は10)。

 

 ■DOPunchCharRotation

回転させる場合はDOPunchCharRotationを使います。

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOPunchCharRotation(iCnt, Vector3.up * 90.0f, 2.0f, 2).SetDelay(0.1f * iCnt);
}

 

f:id:Karvan:20200908215607g:plain

 

 ■DOFadeChar

文字をフェードイン、アウトさせたい場合はDOFadeCharで不透明度を変更することで実装します。

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOFadeChar(iCnt, 1.0f, 2.0f).SetDelay(0.1f * iCnt);
}

第二引数に最終的なアルファ値を指定します。上のソースでは文字が前から順にフェードインします。

f:id:Karvan:20200908215757g:plain

 

これを使って

折角なので現在制作中のゲームにも使ってみることにしました。

アイテムを取得した時のメッセージに対してこれまでは文字全体をフェードアウトさせていましたが

f:id:Karvan:20200908215843g:plain

 

DOTweenTMPAnimatorを使って一文字ずつ左に移動させながらフェードアウトするように変更

f:id:Karvan:20200908215927g:plain

こちらの方が良い感じですね

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。