読者です 読者をやめる 読者になる 読者になる

【Unity】OnStateMoveをoverrideするとRootMotionが適用されずに詰む

StateMachineBehaviourについてのまとめを読んでください

 

yutakaseda3216.hatenablog.com

 

概要

Unity.ver 5.4.4

 

UnityにはStateMachineBehaviourというものがある。

Unity - スクリプトリファレンス: StateMachineBehaviour

 

AnimatorのStateに紐づけられるスクリプトで、そこそこ便利

その中にOnStateMoveというoverrideできるメソッドがある

 

日本語のリファレンスはこんな感じ

Unity - スクリプトリファレンス: StateMachineBehaviour.OnStateMove(Animator animator, AnimatorStateInfo animatorStateInfo, int layerIndex)

何も書いてないに等しい

 

それで今回は表題の通り地雷を踏んだ

 

RootMotion

RootMotionはAnimationに適用されているポジションや回転をオブジェクトに作用させてくれる機能で、それがなぜか効かなくなって半ギレしていた

(Apply Root Motionはチェックを入れていて、そのほかもろもろもすべてokだった)

 

StateMachineBehaviour用の基底クラスを作成して、処理を共通化した時に効かなくなったので何かあるなと思い調査

 

結果、StateMachineBehaviourのOnSTateMoveがRootMotionのPosition更新制御を行っていて、それを直接overrideして書き換えている様子

なので、overrideしているとそのStateにセットされているアニメーションは適用されなくなるらしい

 

base.OnStateMove()を呼んでみたものの、適用されなかったので

 

OnStateMove()は自前で移動処理を書かないなら

絶対にoverrideしてはいけない

 

でFA、OnStateUpdateで間に合わせよう

 

 

この辺の仕様はマジでリファレンスに書いとけよUnity