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

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

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

Cancel

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

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

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