前回の記事で、DOTweenとは何か?他のTweenアセットとの比較や、Unity標準のアニメーションシステムであるMecanimとの比較について解説しました。DOTweenとは?Mecanim(Animator)との違いTweenアセットとは何なのか?その中でもDOTweenを選ぶ理由と、Unity標準のアニメーション機能であるMecanim(Animator)との使い分けについて解説していきます。...今回は、DOTweenの使い方について解説していきます。is...Pro版もありますが、機能的にはフリー版で十分です。Pro版ではGameObjectにDOTweenのコンポーネントをつけてInspectorからアニメーションの設定を行うことができます。非エンジニアに設定を任せる場合は、Pro版も有効かと思います。DOTween自体はオープンソースなので、GitHubから取得することもできます。DG.Tweeningスクリプト冒頭でDG.Tweeningをusing指定して下さい。DG.Tweening;DGって?DOTweenを開発しているDemigiant社の略です。設定Unityのメニューより設定を開くことができます。Preferences基本的にはデフォルトで問題ありません。アニメーション実行方法Transformの例シンプルな例としてTransformの移動について見ていきましょう。向けて0.5秒でtransformのlocalPositionを移動させるという指定です。transform.positionを移動させる場合は、「DOMove」を使用します。負荷軽減の観点から、local系でも問題ない場合はなるべくlocalを使うようにします。今回はDOTweenで実行できるアニメーションの種類を網羅することはしませんが、例として以下のようなことができます。回転:DORotate()拡大/縮小:DOScale()ジャンプ動作:DOJump()パス(経路)をVector3の配列で指定して移動:DOPath()BGM/SEのフェード:AudioSource.DOFade()マテリアル色のアニメーション:Material.DOColor()UI画像のフェード:Image.DOFade()英語にはなってしまいますが、全種類を網羅しているのは公式のドキュメントです。メソッドチェーンで書くのが一般的です。LoopType.Incremental);このように一度Tweenのオブジェクトを受け取ってからオプションを追加しても問題ありません。0.5f);t.SetDelay(1f);DOTweenの仕組みとしてDOLocalMoveを実行した時点ではアニメーションは開始されておらず、そのフレームの最後にまとめてアニメーションを開始します。そのため、アニメーションの実行メソッドを書いた後でも同一フレーム内であればオプションを追加できます。代表的なオプションSetDelay(待機時間/秒)指定秒数、待ってからTweenを再生します。SetRelative()相対的なアニメーションに変更します。LoopType)ループ回数を指定します。-1を指定すると永久ループになります。LoopTypeに指定できる種類は以下の通りです。AnimationCurve)アニメーションの進み具合を指定します。DOTweenで用意されているEase型で指定するか、Unity標準のAnimationCurve型を渡します。等速ならEase.Linearです。前回の記事でも書きましたが、現実世界では物が等速移動することはあまりないため、Easingを指定すると自然に見えます。Easing指定に迷ったら以下のサイトなどで動きを確認しましょう。DOTweenでも同じものを指定することができます。function.各種コールバックコールバックもメソッドチェーンで追加します。});OnStart()再生開始時に呼ばれます。再生開始時っていらないイメージがあるかもしれないですが、先述した通りDOTweenのアニメーションが実行されるのはフレームの最後にまとめてなので、アニメーションの実行を書いた時とは状況が変わっていることもあり得ます。後述するSequenceを使う場合は役に立つことが多々あります。OnUpdate()アニメーション対象のパラメータの値が更新される度に呼ばれます。要するに毎フレーム呼ばれます。OnComplete()完了時に呼ばれます。再生完了を待たずに、完了したことにするComplete()メソッドも存在します。0.5f);t.Complete();OnKill()Tweenオブジェクトが破棄された時に呼ばれます。アニメーションの破棄(Kill)Killされることでメモリにプールされ、Tweenオブジェクトが再利用可能になります。設定でオフにしていない限りは、再生終了時(Complete時)に自動でKillされるようになっています。手動で呼ぶことも可能です。この書き方でもOKt.Kill();DOTween.ToDOTweenで対応されているアニメーション対象にどんなものがあるか忘れてしまったり、そもそも知らなかったということがよくあります。intもしくはfloatの値をアニメーションさせる機能であるDOTween.Toを使えば、どんなパラメータでも間接的にアニメーションさせることができます。前回の記事に載せたサンプル動画でコインが増えるアニメーションのような、数字のアニメーションを例にします。UpdateCoinを呼ぶ度に、現在の値から指定したコイン数まで数字のテキストを更新する処理です。この例では、連続で呼んでも大丈夫なように前回実行したTweenは破棄しています。開始値を渡すメソッドを指定します。更新メソッドを指定します。引数として更新された値を受け取ることができるので、それを使ってTextに反映します。アニメーションの時間を指定します。開始値を渡すのにメソッドを使うgetterではなく値を直接渡せるバージョンもありますが、引数の順番が異なるのとなぜかfloatしか対応していないので注意です。duration)上の例ではsetterにラムダ式を使っていますが、以下のようにメソッドを分けて定義しておき、直接渡すことも可能です。SequenceTweenを順番に実行したい時に使える機能です。以下のように発行します。DOTween.Sequence();この発行したSequenceに対してTweenを追加していきます。追加方法は3つあります。Append()前のTweenが終わってから実行Join()前のTweenと同時に実行Prepend()再生済のものを除いて、先頭に追加Prepend()がちょっとややこしいですが、Sequenceを作った直後ではなくて既に再生して時間が経っている場合をイメージして下さい。再生が終わっているものは無視して、次に再生するTweenとして割り込ませるイメージです。Sequence例サンプル動画で、ハズレだった時の宝箱の攻撃部分のシーケンスです。再生タイミングについて何度も書いてきた通りTween、Sequenceは作ったらフレームの最後にまとめて自動再生されます。(設定で変更可能)事前にオブジェクトだけ作っておいて任意のタイミングで再生したい場合は、作った直後にPause()を実行しておきます。再生したい時になったら、Play()を呼びます。上記のPause()は一時停止の機能なのでいつでも使うことが出来ます。一時停止した場合、再開する時はPlay()とRestart()の使い分けが必要です。最初から再生t.Restart();注意点DOTweenを使う上で注意点がいくつかあるのでこちらで解説します。dll化の罠アセットストアから導入するとdll化されているため、コールバックで発生したエラーを追うのが少し大変です。Consoleでエラーログをダブルクリックして開くファイルと行位置がエラーの原因箇所とずれることがある。エラーがWarning扱いになるといった問題があります。Capacity最初のTweenを実行するとき、もしくはDOTween.Init()をコールした時にまとめてメモリ確保を実行します。以下のメソッドで確保するメモリ量を指定できます。Sequence数);デフォルトはTween200、Sequence50です。この指定値を超えてTweenを実行してしまうとGCAllocが発生し、Warningが出ます。最初から余裕をもったCapacityを設定しておきましょう。スマートフォン端末などでは初回のGCAllocでほぼ間違いなく画面がカクつきます。DOTween.Init()をロード画面など見た目に影響が出ないところで実行しておきましょう。永久ループでCompleteは使えないSetLoops(-1)のオプションを指定して永久ループにした場合は完了しなくなるのでComplete()も使えません。永久ループではないTweenについてはComplete()したら自動でKillされる設定がデフォルトであることは先述した通りです。この認識で、使わなくなったTweenはKill()ではなくComplete()を呼んでおけば良いと思っていると落とし穴にハマる可能性があるので注意して下さい。永久ループの場合はKillが必須です。Killの罠TweenとSequenceで挙動が異なるため、注意して下さい。こちらでまとめDOTweenは使えば使うほど良さが分かってきます。簡単な機能から試してみて下さい。アマガミナブログUnityエンジニア天神いなスマートフォンゲーム会社で新作ゲーム開発のリードエンジニアをしながら個人ゲームの開発もしています。当サイトでは、UnityやC#、シェーダなどゲーム開発の技術的なことを扱ったり、自作ツールの紹介などをしています。