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

【Unity】StateMachineBehaviourについてと注意まとめ

StateMachineBehaviourとは

 

過去記事

 

yutakaseda3216.hatenablog.com

 

 

yutakaseda3216.hatenablog.com

 

 

AnimatorのStateにAddComponentできるスクリプト
(MonoBehaviourみたいな感じ)

クラスに継承させることで使用できる

役に立たない公式リファレンスはこれ
https://docs.unity3d.com/jp/540/ScriptReference/StateMachineBehaviour.html

動作

基本的には用意されたコールバックをoverrideすることで使用する

 

  • OnStateEnter
  • ステートマシンがこのステートを評価している場合、最初の Update のフレームで呼び出されます。

MonoBehaviourで言うところのStart()

 

  • OnStateUpdate
  • 最初と最後のフレームを除いて Update フレームごとに呼び出されます。 

MonoBehaviourで言うところのUpdate()

 

  • OnStateExit
  • ステートマシンがこのステートを評価している場合、最後の Update のフレームで呼び出されます。 

MonoBehaviourで言うところのOnDestroy()


Update()が完全に流れなくなるフレームで呼ばれる

 

 

----------この辺からよく知らずに使うと闇---------------------------------

 

 

  • OnStateIK
  • MonoBehaviour.OnAnimatorIK の直後に呼び出されます。

IKを使用した処理を行う


overrideすると、IKの処理を自前で実装することになり(Animator.SetIK〜を使う)

 

Stateに対してIKが自動で適用されなくなる

base.OnStateIKを呼んでもダメ

 

基本overrideする必要なし

 

  • OnStateMove
  • MonoBehaviour.OnAnimatorMove の直後に呼び出されます。 

Animationに設定されたRootAnimationの処理を行う

 

Animation内のPosition、Rotation、Scaleに関わる処理が行われるため

 

overrideすると、Stateに対してRootAnimationが適用されなくなる

base.OnStateMoveを呼んでもダメ 

 

基本overrideする必要なし

 

 

AnimationCrossFade時のStateの取り扱いについて

CrossFadeのリファレンス

https://docs.unity3d.com/jp/540/ScriptReference/Experimental.Director.IAnimatorControllerPlayable.CrossFade.html


AnimationがCrossFadeしている時(durationが0以上の時)

 

CrossFadeが終了するまで、CurrentStateはCrossFade元のまま
さらに、normalizedTimeもそのまま加算され続ける

 

normalizedTimeを使用した処理をする時は、CrossFadeを使用しないようにするか
自前でnormalizedTimeを使用しよう

 

 

最後に

 

用法用量を守って使う
基底クラスを作ろうとしてOnStateMoveとOnStateIKをoverrideすると痛い目にあう(あった)