【Unity】ルートモーションの概念と設定方法をサクッと理解する

わかりづらいUnityのルートモーションの仕組みと設定方法を簡単に理解できるようにまとめました。

Unity2018.3

座標移動が含まれるアニメーションをそのまま再生する

今、一番ルートのオブジェクトの座標を動かすモーションがあるとします。
一回モーションを再生するとX軸方向に少し移動するようなモーションをループで再生するとします。
結果、当然ですが位置はどんどん進んでいきます。

f:id:halya_11:20190205212325g:plain

しかし座標はスクリプトでコントロールしたい

しかし、ユーザが自由に移動できるようなゲームでは、モーションに応じて勝手に移動されては困ります。
位置はユーザの入力に応じてスクリプトで制御したいところです。

このような場合には、AnimatorのApply Root MotionをOFFにします。

f:id:halya_11:20190205212551p:plain

すると、モーションによる移動値が反映されなくなります。

f:id:halya_11:20190205212638g:plain

この状態でスクリプトからルートのオブジェクトのTransformをいじれば自由に移動させられます。

特定のモーションだけスクリプト制御で移動したい

前節の方法では、Animatorのプロパティを変更するので、そのキャラクターに適用されるすべてのモーションのルートモーションがOFFになってしまいます。
これでは例えば、「歩きモーション時は移動値をスクリプトで制御したいものの吹き飛ぶモーションの時は移動量をモーションに任せたい」といった時に困ります。

そこで、特定のモーションのルートモーションだけをOFFにする方法を考えます。
まず前節でOFFにしたAnimatorのApply Root MotionはONにしておきます。
そしてモーションのImport SettingsのAnimationタブ、Motion > Root Motion Node を<Root Transform>にします。

f:id:halya_11:20190205212807p:plain

これで、このモーションのルートモーションだけがOFFになります。

移動だけでなく回転も同じ考え方でOK

ルートモーションの考え方は、移動値だけでなく回転値についても同様です。

たとえば、一回あたりY軸正方向に30度回転するモーションがあるとします。
これをルートモーションを適用して再生すると回転しつづけることになります。

f:id:halya_11:20190205212948g:plain

前節までの設定方法でルートモーションをOFFにすれば、回転しなくなります。

f:id:halya_11:20190205213228g:plain

移動値はスクリプトで制御したいけど回転値はモーションに任せたい

最後に、移動値だけはスクリプトで制御したいが、回転値はモーションに任せたい場合を考えます。
つまり、回転値にだけルートモーションを適用します。

この場合は、まずAnimatorのApply Root MotionをONにしておきます。
次にRoot Motion Nodeは<None>に設定します。
<None>にすると、次のような設定項目が現れます。

f:id:halya_11:20190205213438p:plain

このうちRoot Transform Positionにチェックを入れ、Root Transform Rotationのチェックは外します。

f:id:halya_11:20190205213520p:plain

すると回転値だけルートモーションを適用することができます。