はじめに
- Unity で「アニメーション」をする方法って色々あって、「正直どれが最適なのか分からん!」って声が聞こえた気がするので、 個人的な見解 を紹介してみる。
Animator
- 恐らくアニメーション用途として最も利用されている機能かな?
- ステートマシンを用いてアニメーションの状態遷移を管理できる。
- メニュー上で
Assets
>Create
>Animator Controller
を選択すると作られる Animator Controller (拡張子:.controller
) というファイルに Animator のステートマシン情報が記載される。- どういう条件でアニメーションを再生するのか?みたいな。
- アニメーションの実態は
Assets
>Create
>Animation
を選択すると作られる Animation Clip (拡張子:.anim
) というファイルに記載される。- どのプロパティを、どういうカーブでアニメーションさせるのか?みたいな。
- (その昔、 Animation という単独の機能があったが、 Obsolete 状態になっており、 Animator が代替と言える。)
メリット
- アニメーションの定義を Unity Editor 上で完結できる。
MonoBehaviour.Update()
メソッドとかでアニメーションさせるよりも(多分)パフォーマンス的に有利。- 中間補完やアニメーションブレンディングなど「よしなに」アニメーションしてくれる。
- AnimationEvent を用いたイベント処理もできる。
- ただし、コードから追いづらいため、バグの温床になったりもする。
デメリット
- Unity Editor 上での操作に対する学習コストが高い。
- Animation Clip 編集用の Dope Sheet とか Animation Curve 編集画面とかは、 Flash 経験者なら馴染みがあるかも?
- ステートマシンがゴチャゴチャになりがち。
- スクリプトでの操作と組み合わせたアニメーションを行おうと思うと柔軟性に欠ける。
- Animator Controller 内に含まれる Animation Clip が操作する対象のプロパティはスクリプトから(原則)いじれない、とか。
Reference
MonoBehaviour.Update()
- 毎フレーム呼び出されるメソッドなので、初期値とか終了値とか経過時間とかを巧いこと管理できればアニメーションの実装もできる。
- DOTween とかの Tween ライブラリは、本質的には
Update()
での実装と言えるかも。- 内部実装読んだわけじゃないから分からんけど、多分最終的にはフレーム毎にゴリゴリ計算してるはず。
- シンプルな移動とかに使う分にはアリっちゃありかも。
メリット
- 実装力があれば、最強に柔軟な手法。
- 世の中に優れたライブラリが存在している。
デメリット
- Easing Curve とかも考え出すと自前実装は沼でしかない。
- メッセージングによる呼び出しになるため、他に比べるとパフォーマンス的に不利。
- それなりに数学的な知識を必要とする。
- まぁ、他も本質的にはそうなんだけどねw
Reference
物理演算
- スクリプトベースでサッとやるなら、割とアリな手法かも。
- 程よいパラメータを見つけ出せれば、記述量は減らせる。
- 基本的には
Rigidbody.AddForce()
なりRigidbody.AddTorque()
なりのメソッドを叩く感じになると思うので、加える力を調整する感じかな?
- 基本的には
メリット
- 巧くやれば自然なアニメーションになる。
- スクリプトベースでありながら、計算を全て Unity (というか Physics)に丸投げできる。
デメリット
- 小回りが効かない。
- 途中で処理を介入させたりすると、思わぬ挙動をしたりするので、結構ヤバみある。
FixedUpdate()
というUpdate()
のサイクルとは別のメッセージングサイクルになるため、他のスクリプト実装とぶつかるコトがあり得る。- 「良い感じ」のパラメータを見つけるのが大変。
- アニメーションそのものに対するイベント処理がやりづらい。
- 「移動が終わったとき」みたいなイベントフックは面倒。
Reference
まとめ
- 適材適所ではあるが、学習コストを飲み込んでも Animator でアニメーションするのがベターかな。
- メンテナンス性が必要ないようなプロジェクトであれば、物理演算でサッと書き捨てるのも良いかも。