Unityでアニメーションを再生する際、モデルの座標や角度などをどう動かすかを決める設定が多数あります。
これらは非常にわかりずらく問題に気づきにくいので、この記事ではルートモーションについて簡単にまとめていきます。
座標をスクリプトで操作したい場合「Apply Root Motion」
「Apply Root Motion」のチェックを外すと、アニメーションの移動が無効になり、その場から移動しないままアニメーションが発生するようになります。
移動はすべてスクリプトから制御を行いたい場合に利用します。
また、移動を含む(OnAnimatorMove)スクリプトがアタッチされている場合は以下のように「Handle by Script」と表示されます。
一部のアニメーションのみをスクリプトで制御する方法
「Apply Root Motion」をオフにする方法では、全てのルートモーションがオフになります。
実際は、アニメーションによって異なった制御をしたいことが多くなるかと思います。
この場合、モーションごとにルートモーションを設定することが可能です。
「Apply Root Motion」のチェックを入れた状態で、アニメーションのインスペクターから、Root Motion Nodeを「<Root Transform>」にします。これで、このモーションだけがルートモーションだけがOFFになります。
回転や移動など一部をルートモーションにする方法
回転や、移動だけを選んでルートモーションに適用する方法もあります。
前節の Root Motion Nodeを<None>にして一度Applyで確定します。
すると、「Root Transform Rotation」,「Root Transform Position(Y)」,「Root Transform Position(XZ)」の入力項目が出現します。
- 「Root Transform Rotation」
[Bake Into Pose]…チェックを入れるとルートオブジェクトの回転に反映されなくなります。
[Based Upon]… Originalに設定するとアニメーションのデータ通りになります。BodyOrientationはBodyの前方ベクトルに合わせる。 - 「Root Transform Position(Y)」
[Bake Into Pose]…チェックを入れるとルートオブジェクトのY座標に反映されなくなります。
[Based Upon]…Originalはアニメーションの基点、Center Of Massは重心、Feetは足元に設定します。 - 「Root Transform Position(XZ)」
[Bake Into Pose]…チェックを入れるとルートオブジェクトのX/Z座標に反映されなくなります。
[Based Upon]…Orizginalはアニメーションの基点、Center Of Massは重心を基準にします。
この設定が正しくないと、移動のたびに意図した場所とは違った場所に移動してしまいます。微妙にずれてしまうような場合はこれが適した設定にされていない可能性が高いです。
結局どの方法を選べばいいのか?
これは独断と偏見の私的な意見ですが、極力アニメーションにあわせて動かすのがいいのかなと思っています。
理由としては、スクリプトからアニメーションにあわせて移動や回転をさせても自然な動きにするのはかなり難しいからです。それであれば、アニメーションにあわせてスクリプトを書くほうが良いできになりやすいでしょう。
もちろん状況によっては、ルートモーションを用いたほうが便利なシーンもありますから必要に応じて使い分けていけると良いと思います。
今回の記事が、皆さんの助けになると嬉しいです。
もしこの記事が気に入りましたら、ぜひテクリエイトへのブックマーク登録をして頂けると喜びます。
以上、おつかれさまでした!
© Unity Technologies Japan/UCL