PR

【Unity】ルートモーションを使えるように改造する方法

Unity

ルートモーションを独自カスタマイズする方法

手順としては下記になります。

  1. Animatorがアタッチされているゲームオブジェクトに独自のスクリプトをアタッチ
  2. スクリプトに「OnAnimatorMove」というコールバック関数を設定
  3. 関数内から「Animator.deltaPosition」の値を位置に反映する

すると…ゲーム上のキャラが勝手に動きます!

独自のキャラクターコントローラーなどを作っている場合、そこに移動値を渡して上げるとゲームの仕組みを阻害せずに実装することができます!

ちなみに回転を反映する場合はdeltaRotationを反映して上げると反映可能です。

 

シンプル:特定のTransformに加算するスクリプト

インスペクターに値を反映したい対象を設定すると
ルートモーションの値が反映されます。

 

RootMotionController.cs

public class RootMotionController : MonoBehaviour
{
    [SerializeField] private Transform targetTransform;

    private Animator _animator;

    private void Awake()
    {
        _animator = GetComponent<Animator>();
    }

    private void OnAnimatorMove()
    {
        targetTransform.localPosition += _animator.deltaPosition;
        targetTransform.localRotation = _animator.deltaRotation * targetTransform.localRotation;
    }
}

シンプルに受け取った移動値をTransformに加算したり
回転はさらに回転したりしている感じですね

 

参考:キャラコントローラーや独自クラスに値を加算するスクリプト

参考程度ですが、専用のキャラコントローラーを使っている私はこのように使っています。

RootMotionController.cs

public class RootMotionController : MonoBehaviour
{
    [SerializeField] private CharacterControl control;

    private Animator _animator;

    private void Awake()
    {
        _animator = GetComponent<Animator>();
    }

    private void OnAnimatorMove()
    {
        var deltaPosition = _animator.deltaPosition;
        control.Move(deltaPosition);
    }
}

 

以前動画の進捗で紹介したキャラ操作のコントローラーを自作しているので
そちらに値を渡している感じです。

アセットなどでも同様のものがあると思われるので使わている方は
このようにつなぎこめば良さそうですね。

ちなみに私の場合は回転は使わないので設定していないです

 

実際にルートモーションに移行しました

自分もルートモーションで動かすことができるようになりました。
ローリングやバックステップ、武器の移動などアニメーション通りに動くことができるようになりました。

今まで辻褄合わせで移動を作っていましたが
これからめちゃくちゃ開発がはかどりそうです!

 

活動内容のPR

下記が本サイトでの活動内容となります。

他の開発動画を見る

 

終わりに

今回は今まで利用を諦めていたルートモーションの活用方法について紹介させていただきました。

もともとほかのゲームエンジンでもよく使われる機能なので知ってはいたものの
調べると使うときのルールも厳しそうなので使えないと思っていたので
カスタマイズできると知ったときは歓喜しました。

ルートモーションを活用できると色々アニメーションで完結できる部分も多く管理しやすくなるので気になる方はぜひ活用してみてくださいね。

では今回はここで終わりたいとおもいます。
ここまでお読みいただきありがとうございました。

 

 

 

コメント

スポンサーリンク
タイトルとURLをコピーしました