Version: Unity 6.0 (6000.0)
言語 : 日本語
ルートモーションの仕組み
Animator コンポーネント

ルートモーションのスクリプティング

アニメーションが “定位置” にいる場合があります。つまり、シーンに配置したときにアニメーションを付けたキャラクターが動きません。これはアニメーションに “ルートモーション” がついていないということです。この場合、スクリプトからルートモーションを修正できます。修正するには、以下の手順に従ってください (一例であり同じ結果を得る方法は複数あります)。

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

ルートモーションの仕組み
Animator コンポーネント