ルートモーションの仕組み
メカニム パフォーマンスおよび最適化

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

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

  • 不動のアニメーションを含む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 と表示されます。

ルートモーションの仕組み
メカニム パフォーマンスおよび最適化