わかりづらいUnityのルートモーションの仕組みと設定方法を簡単に理解できるようにまとめました。
- 座標移動が含まれるアニメーションをそのまま再生する
- しかし座標はスクリプトでコントロールしたい
- 特定のモーションだけスクリプト制御で移動したい
- 移動だけでなく回転も同じ考え方でOK
- 移動値はスクリプトで制御したいけど回転値はモーションに任せたい
Unity2018.3
座標移動が含まれるアニメーションをそのまま再生する
今、一番ルートのオブジェクトの座標を動かすモーションがあるとします。
一回モーションを再生するとX軸方向に少し移動するようなモーションをループで再生するとします。
結果、当然ですが位置はどんどん進んでいきます。
しかし座標はスクリプトでコントロールしたい
しかし、ユーザが自由に移動できるようなゲームでは、モーションに応じて勝手に移動されては困ります。
位置はユーザの入力に応じてスクリプトで制御したいところです。
このような場合には、AnimatorのApply Root MotionをOFFにします。
すると、モーションによる移動値が反映されなくなります。
この状態でスクリプトからルートのオブジェクトのTransformをいじれば自由に移動させられます。
特定のモーションだけスクリプト制御で移動したい
前節の方法では、Animatorのプロパティを変更するので、そのキャラクターに適用されるすべてのモーションのルートモーションがOFFになってしまいます。
これでは例えば、「歩きモーション時は移動値をスクリプトで制御したいものの吹き飛ぶモーションの時は移動量をモーションに任せたい」といった時に困ります。
そこで、特定のモーションのルートモーションだけをOFFにする方法を考えます。
まず前節でOFFにしたAnimatorのApply Root MotionはONにしておきます。
そしてモーションのImport SettingsのAnimationタブ、Motion > Root Motion Node を<Root Transform>にします。
これで、このモーションのルートモーションだけがOFFになります。
移動だけでなく回転も同じ考え方でOK
ルートモーションの考え方は、移動値だけでなく回転値についても同様です。
たとえば、一回あたりY軸正方向に30度回転するモーションがあるとします。
これをルートモーションを適用して再生すると回転しつづけることになります。
前節までの設定方法でルートモーションをOFFにすれば、回転しなくなります。
移動値はスクリプトで制御したいけど回転値はモーションに任せたい
最後に、移動値だけはスクリプトで制御したいが、回転値はモーションに任せたい場合を考えます。
つまり、回転値にだけルートモーションを適用します。
この場合は、まずAnimatorのApply Root MotionをONにしておきます。
次にRoot Motion Nodeは<None>に設定します。
<None>にすると、次のような設定項目が現れます。
このうちRoot Transform Positionにチェックを入れ、Root Transform Rotationのチェックは外します。
すると回転値だけルートモーションを適用することができます。