ルートモーションの仕組み
ブレンドツリー

チュートリアル:マニュアルでのルートモーションのスクリプティング

ときどきアニメーションは“不動” となっているものがあり、つまりシーンにおいたときに、アニメーションつきキャラクターが動かないことがあります。言い換えると、アニメーションに “ルートモーション” がついていません。この場合、スクリプトからルートモーションを修正することができます。すべてをつなぎあわせるには、次の手順にしたがって進めます(同じ結果を得られる方法は複数あって、これはあくまでそのひとつであることに注意してください)。

  • 不動のアニメーションを含む FBX ファイルで Inspector を開いて Animation タブに移動します。
  • Muscle Definition が制御するアバターに設定されていることを確認します(仮に Dude というアバターであるとして、すでに Hierarchy View に追加されているとします)。
  • 利用可能なアニメーションクリップの中からアニメーションクリップを選びます。
  • Loop Pose が正しく整列されていることを確認して (ライトが緑であることを確認)、そして Loop Pose がチェックされていることを確認します。
  • アニメーションビューでアニメーションをプレビューし、アニメーションの開始と終了がスムーズに整列されていて、そしてキャラクターが不動のままであることを確認します。
  • アニメーションクリップ上で、キャラクターのスピードを制御するカーブを作成します (Animation Import inspector Curves-> + からカーブを追加できます)。
  • カーブを “Runspeed” など何か意味あるものとしてネーミングします。
  • 新規に Animator Controller を作成します(__RootMotionController__ と呼ぶことにします)
  • 希望するアニメーションクリップをその上にドラッグ&ドロップすると、アニメーションの名前(例えば__Run__)でステートが作成されます
  • カーブと同じ名前のパラメーターをコントローラーに追加します(この場合は“Runspeed”)
  • Hierarchy でキャラクター Dude を選択すると、インスペクターはすでに Animator コンポーネントが追加されています。
  • RootMotionController をアニメーターの Controller プロパティー上にドラッグします。
  • このときに再生すると、“Dude” はその場で走る動作をします。

最後に、モーションを制御するためには、OnAnimatorMoveコールバックを実装するスクリプト(RootMotionScript.cs)を作成する必要があります。

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Animator))]
    
public class RootMotionScript : MonoBehaviour {
            
    void OnAnimatorMove()
    {
            Animator animator = GetComponent<Animator>(); 
                              
            if (animator)
            {
     Vector3 newPosition = transform.position;
               newPosition.z += animator.GetFloat("Runspeed") * Time.deltaTime; 
     transform.position = newPosition;
            }
    }
}


RootMotionScript.cs を“Dude” にアタッチします。アニメーターコンポーネントは OnAnimatorMove があるスクリプトを検知して、 Apply Root Motion プロパティーに Handled by Script と表示されます。

ルートモーションの仕組み
ブレンドツリー