Unity

DOTweenとは?Mecanim(Animator)との違い

DOTweenとは?Mecanim(Animator)との違い

この記事ではTweenアセットとは何なのか?その中でもDOTweenを選ぶ理由と、Unity標準のアニメーション機能であるMecanim(Animator)との使い分けについて解説していきます。

DOTweenで出来ることのイメージ用として、サンプルゲームを作りました。

サンプルゲームに使用しているユニティちゃんモデル及び背景はユニティちゃんライセンスの元に提供されています。
© Unity Technologies Japan/UCL

ユニティちゃんのモーション以外は、DOTweenを使用してアニメーションを付けています。

Tweenアニメーション使用例
  • Phaseテキスト表示
  • 宝箱の開閉・シャッフル
  • コイン数値の増加
  • ふっとばされる演出
  • ダメージを受けた時の点滅 ※
  • ゲージアニメーション
  • ボタンを押した時の反応
  • アイテムによる宝箱の透明化 ※

※1フレーム毎にオブジェクトの表示/非表示を繰り返すと半透明っぽく見えるという手法を使っているため、動画のフレームレートが落ちていると表示されたまま、もしくは完全に消えていることがあります。

Tweenアセットとは

スクリプトから移動値時間を指定してアニメーションを実行する機能を提供してくれるアセット(ライブラリ)です。

例:今いる座標(0,0,0)から座標(0,0,10)へ0.5秒で移動

移動値と書きましたが、移動以外に回転やスケールなど、様々なパラメータをアニメーションさせることができます。

各アセットに共通する特徴

各種コールバック

開始時、更新時、完了時、中断された時など、必要なタイミングで処理をはさむことができます。

特にアニメーションの完了時は追加の処理をしたいことが多いため、便利です。

Easing指定

Unity標準のアニメーション機能で使われているアニメーションカーブを使ってアニメーションさせることも可能ですが、Easing指定をすることで気持ちいいアニメーションを気軽に実現できます。

Easingが有効な理由

現実世界で物が等速で移動することはあまりありません。アニメーションにカーブをつけることで、より自然に見えます。

Easingの概念はUnityのTweenアセットに限ったものではなく、WebのjQueryなどでも同じです。

種類ごとの動きは以下のサイトで見れます。(他にも良いサイトがあったのですが、現在は全てリンク切れです…)

比較の前に

Tweenアセットを比較する上で重要なのは使いやすさもありますが、処理性能の問題です。

特にGC(ガベージコレクション)GCAllocが重要なので、まずこちらを解説します。

これだけで一冊の分厚い本が出るくらい深い内容なのでここでは簡単に説明します。既にご存知の方は読み飛ばして下さい。

GC(ガベージコレクション)

C#ではプログラマが確保したメモリ(ヒープメモリ)は使われなくなると自動的に解放されます。

これをGC(ガベージコレクション)と言います。

そして、このGCの処理は非常に重いです。

GCの頻度が多いと処理性能の低い環境ではゲーム画面がカクカクしてしまうことになります。

せっかくアニメーションをたくさん付けたのに、ゲーム画面がカクカクしてしまっては綺麗に見えなくて勿体ないですよね。

そこで意識するべきなのがGCAllocです。

GCAlloc

GCが発生する原因となるのがヒープメモリへのメモリ確保であるGCAllocです。

このGCAlloc自体も重い処理です。

先ほどからヒープメモリと書いていますが、GCAllocが発生しないメモリ確保はスタックメモリの確保です。

スタックメモリはメソッド内だけで使うことが確定しているメモリ確保(つまりローカル変数)で、メソッドを抜けたら解放されます。こちらは高速です。

ヒープメモリの確保はロード画面で済ませておき、ゲーム中はスタックメモリで済ませるというのがメモリ最適化の基本思想です。

C#でGCAllocが発生する処理としては、主に以下のようなものがあります。

  • LINQ
  • クラス、配列のnew
  • 文字列の操作
  • デリゲート

GCの仕組みとして、確保したメモリが使われているか(nullじゃないか)を調査して使われていなかったらメモリ解放を実行します。

つまり、ゲームの途中で使われなくなるようなGCAllocをゲーム中に行ってしまうと、GCAllocとGCの両方が発生することになります。

アニメーションに当てはめると、再生開始する時にアニメーション制御用クラスのインスタンス生成を行うとGCAllocが発生し、終了時にもう使わないからとnullにするとGCが発生するわけです。

GCAllocが発生しているかどうかは、Profilerで確認することができます。

Profiler GCAlloc

DOTweenでは、このGCAllocをうまく防止しています。

DOTweenのGCAlloc防止策

DOTweenにはTweenとSequenceという機能がありますが、最初にTween200個、Sequence50個のメモリを自動で確保します。(この数は変更可能)

この最初に確保する数をCapacityといって、例えばC#の標準機能でもListなどのコレクションはCapacityを引数にとることでGCAllocの防止策を提供しています。

多めに確保するっていいの?

使わないかもしれないのに多めにメモリを確保しちゃって大丈夫なの?という話ですが、これはメモリが限られている昔の環境では問題でした。

しかし今はPCでもスマートフォンでも潤沢なメモリがあり、小さなメモリを気にして節約するくらいなら、最初に多めに確保してしまった方がGCAllocが防止できて良い。という考え方が主流になってきています。

Unityの最新機能であるDOTSも、この考え方で作られています。

Tweenアセットの比較

すべて無料です。

iTween

聞いたことのある方や使っている方もいるでしょうか?

ほんの数年前であれば、一番人気のあったTweenアセットです。

機能も充実していて使いやすいですが、先ほど解説したGCAllocを伴い重いため、今となっては使わない方が良いでしょう。

HOTween

こちらはDOTweenの前身です。現在は特に使う理由はありません。

LeanTween

現在DOTween以外で良いTweenアセットはこれです。

iOSへの最適化を売りにしていて、パフォーマンスは非常に良いです。有名タイトルで使われている実績もあります。

DOTweenのサイトですが性能比較があり、こちらでもLeanTweenの性能面の凄さが分かります。

GoKit

僕も上記のDOTweenのサイトにある性能比較で初めて知ったのですが、日本語で使い方の解説などが全然ないことも考えるとわざわざ選ぶ理由はないでしょう。

DOTween

LeanTweenよりもDOTweenの方が機能の面で充実しているので、特に深い理由がなければDOTweenをオススメしています。

以前は日本語で使い方の解説記事なども少なかったのですが、最近は増えてきました。

TweenとMecanimの使い分け

MecanimはUnity標準のアニメーション機能です。

Animator、AnimatorController、AnimationClipなどの機能を組み合わせて、ステート形式でアニメーションを作成します。

使い分けが必須になるケース

Mecanim

キャラクターモーションです。主にスキンメッシュアニメーションと呼ばれているものになります。

こちらはTweenでは対応できないため、Mecanimが必須です。

先ほどのサンプルゲームでも、ユニティちゃんのモーションはMecanimを使用しています。

Tween(もしくは自前スクリプト)

ゲームの状況によってパラメータが変化するアニメーションです。

Mecanimは事前に作成した固定アニメーションを再生するものなので、例えば移動先が状況に応じて変わる場合、その分だけアニメーションを作成しておく必要がありパターンが多すぎると現実的ではありません。

Tweenであれば、スクリプト上で移動先を指定するだけなので簡単です。

要検討なケース

アーティストが調整するアニメーション

Tweenはスクリプト上でアニメーションを作っていくので、エンジニア以外が調整するのが難しいです。

調整が必要な場合、パラメータをInspectorから調整できるようにしておくなどの対応をします。

Mecanimであれば、Mayaなどで作成したデータのインポートに対応しています。

また、Unity上でも専用エディタで調整が可能です。

アニメーションの対象が多い場合

Mecanimのアニメーションを再生するには、対象全てにAnimatorコンポーネントを付ける必要があります。

これは少なからずメモリに負荷をかけます。

Tweenであれば特にコンポーネントを付けておく必要はなく、スクリプトから指定すればそのタイミングで実行できます。

性能比較からも分かる通り、DOTweenやLeanTweenであれば大量のアニメーション実行に対応できます。

ブレンドしたい場合

アニメーションをブレンドしたい場合、MecanimであればAnimatorControllerにはBlendTreeやステート遷移時にブレンドする機能があり、簡単に対応できます。

Tweenの場合は難しく、基本的には1つ前のアニメーションを止めてから新しいアニメーションを再生することになります。ブレンドには不向きと言えるでしょう。

アニメーション完了時に何かしたい場合

Mecanimはステートマシンで管理する関係上、「既に終了しているか」は取得しやすいものの、終了したタイミングで何か処理をするということが難しく、若干テクニックが必要です。

Tweenであれば、先述した完了時のコールバックで対応できます。

まとめ

以上を踏まえてMecanimとTweenを使い分けつつ、Tweenに関してはパフォーマンスや利便性の面で優れているDOTweenを使うことをオススメします。

ゲームの見た目はアニメーションをたくさん付けていくことで確実に良くなっていくので、積極的に使っていきましょう!

DOTweenの具体的な使い方については次の記事で解説しています。

DOTweenの使い方 - Tweenアニメーション入門【Unity】
DOTweenの使い方 Tweenアニメーション入門【Unity】UnityでTweenアニメーションを行うのに最適なアセットであるDOTweenの使い方について。基本形から、よく使うオプション、便利なDOTween.ToやSequenceの機能、DOTweenを使う上での注意点など幅広く扱っています。...