2019/01/15更新 - 利用環境:Unity2018.3
Mecanim(AnimatorController)はNavMeshAgentやCharacterControllerと一緒に使うケースがほとんどではないでしょうか。
その場合についてまわるのが
アニメーションに合わせてGameObjectのTransformを移動するか
という問題です。
思ったとおりの動作をさせるにはそれぞれに合った設定が必要になり、ハマることがあります。
参考素材はおなじみのアニメーションアセットを使っています。
いつもお世話になっております。
Mecanim Locomotion Starter Kit - Asset Store
Raw Mocap Data for Mecanim - Asset Store
ApplyRootMotionのチェック
3Dモデルが前方に歩いていくアニメーションを例にとります。
紹介したアセット Mecanim Locomotion Starter Kit のサンプルシーン (Assets/Locomotion Setup/TestScene) を開くと、すでにアニメーション用にセットアップしてある人物モデルがシーンに配置されています。
Playボタンを押してゲームを起動すると、十字キーを押すことで移動ができます。
この人の AnimatorController を見るとチェックボックスがあり、
チェックが入っていると、アニメーションによってモデル自体が前方に移動していきます。
このチェックを外すと、アニメーションによってGameObjectの位置は変わらなくなります。
このチェックボックスは、アニメーションに設定されている位置情報をそのままTransformの位置更新に適用するか を設定するパラメータです。
AnimationClip アセットが、ルート位置が移動するようなものだった場合、それがそのままTransformに影響します。
チェックを入れてもモデルの位置が移動しない場合、そもそも使っている AnimationClip 自体が位置を変更しない類のものだと思われます。パントマイマーのアニメーしょんとかがそうですね。違うよね。
アニメーションとTransformの位置が同期してくれない場合
単にApply Root MotionをONにしただけでは、位置の同期がうまくいかない場合があります。
例としてダウンロードしたアニメーションアセット Raw Mocap Data の Run_JumpUpLow_Stride_Run を使ってみます。
インスペクタービューでアニメーションを表示し、Animationsタブを選択することでパラメータを見てみると、
下部のチェックリストに何もチェックが入っていない状態です。
この状態でアニメーションとTransformの値がどうなっているか見てみます。
ちゃんとアニメーションに合わせてTransformの位置も変わっていますね。
この設定の Root Transform Position (Y)のBake Into Pose にチェックを入れて実行してみましょう。
インスペクタの値を眺めていると、Y座標が0のままであることがわかります。
この設定で何がおきるかというと例えば、コライダーを付けてアニメーションさせている場合、コライダーのY座標が変わらない ということがおきます。
つまり、ジャンプしているように見えるのに、足元の障害物に引っ掛かってしまうという状況が発生してしまいます。
BakeIntoPoseのチェックを外すことで、アニメーションとGameObjectの位置の同期がとれます。
もちろんApplyRootMotionのチェックも入れる必要があります。
もしアニメーションとTransformの動きが一致しないというときは、AnimationClipの設定も確認しましょう。