ルートモーションを独自カスタマイズする方法
手順としては下記になります。
すると…ゲーム上のキャラが勝手に動きます!
独自のキャラクターコントローラーなどを作っている場合、そこに移動値を渡して上げるとゲームの仕組みを阻害せずに実装することができます!
ちなみに回転を反映する場合は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); } }
以前動画の進捗で紹介したキャラ操作のコントローラーを自作しているので
そちらに値を渡している感じです。
アセットなどでも同様のものがあると思われるので使わている方は
このようにつなぎこめば良さそうですね。
ちなみに私の場合は回転は使わないので設定していないです
実際にルートモーションに移行しました
自分もルートモーションで動かすことができるようになりました。
ローリングやバックステップ、武器の移動などアニメーション通りに動くことができるようになりました。
アニメーション側で移動できるようにしました#ゲーム制作 pic.twitter.com/Rlzyn9Ut04
— Tadapy@個人ゲーム制作 (@tadapy88) August 18, 2023
今まで辻褄合わせで移動を作っていましたが
これからめちゃくちゃ開発がはかどりそうです!
活動内容のPR
下記が本サイトでの活動内容となります。
終わりに
今回は今まで利用を諦めていたルートモーションの活用方法について紹介させていただきました。
もともとほかのゲームエンジンでもよく使われる機能なので知ってはいたものの
調べると使うときのルールも厳しそうなので使えないと思っていたので
カスタマイズできると知ったときは歓喜しました。
これは…使える!😎
— Tadapy@ゲーム開発 (@tadapy88) August 5, 2023
ルートモーションを活用できると色々アニメーションで完結できる部分も多く管理しやすくなるので気になる方はぜひ活用してみてくださいね。
では今回はここで終わりたいとおもいます。
ここまでお読みいただきありがとうございました。
コメント