チュートリアル:マニュアルでのルートモーションのスクリプティング 
  		        
                Suggest a change 
                
                  
                  
                    Success! 
                    Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.
                    Close 
                   
                  
                    Sumbission failed 
                    For some reason your suggested change could not be submitted. Please try again  in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.
                    Close 
                   
                  
                 
               
ときどきアニメーションは“不動” となっているものがあり,つまりシーンにおいたときに,アニメーションつきキャラクターが動かないことがあります。言い換えると,アニメーションに “ルートモーション” がついていません。この場合,スクリプトからルートーモーションを修正することが出来ます。全てをつなぎあわせるには,次の手順にしたがって進めます(同じ結果を得られる方法は複数あって,これはあくまでそのひとつであることに留意して下さい)。
不動のアニメーションを含むFBXファイルでInspectorを開いて,Animation  タブに移動します。 
 が制御をしたアバターにセットされていることを確認します(仮に_Dude_ というアバターであるとして,すでにHierarchy View  に追加されているとします。) 
利用可能なアニメーションクリップの中からアニメーションクリップを選びます。 
Loop Pose  が正しく整列されていることを確認して(緑の隣のライト),そしてLoop Pose  がチェックされていることを確認します。 
 
 
 
アニメーションビューでアニメーションをプレビューし,アニメーションの開始と終了がスムーズに整列されていて,そしてキャラクターが不動のままであることを確認します。 
アニメーションクリップ上で,キャラクターのスピードを制御するカーブを作成します(Animation Import inspector   からカーブを追加できます)。 
カーブを “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  と表示されます。