Unity动画生命周期-internal animation update|解决动画信息不正确问题

前言

Unity脚本从唤醒到销毁有着一套比较完善的生命周期,动画系统的回调函数也有着自己独立的生命周期,它类似Unity框架中Update与LateUpdate生命周期。我们获取某一时刻正确的动画信息需要先了解动画系统的生命周期以及在整个框架中的执行顺序。

动画系统生命周期

在Unity官方手册中也称它为internal animation update、Animation update loop。

主要成员

  • OnStateMachineEnter:状态机更新步骤中,当控制器的状态机进行流经 Entry 状态的转换时,将在第一个更新帧上调用此回调。

  • OnStateMachineExit:状态机更新步骤中,当控制器的状态机进行流经 Exit 状态的转换时,将在上次更新帧上调用此回调。
  • StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit):一个层最多可以有 3 个活动状态:current state(当前状态), interrupted state(中断状态), and next state(下一个状态)。为每个活动状态调用StateMachineBehavior组件中定义的对应的OnStateEnter、OnStateUpdate或OnStateExit回调。

    该函数首先调用当前状态,然后调用中断状态,最后调用下一个状态。 (currentState Update ->currentState Exit ->nextState Enter)

  • OnAnimatorMove:每个更新帧,每个更新帧调用一次Animator Component以修改Root Motion
  • StateMachineBehaviour(OnStateMove):这是在每个活动状态上调用的,状态机器行为定义了此回调。
  • OnAnimatorIK:设置动画 IK。对于启用了 IK 传递的每个动画师控制器层,将调用一次此函数。

    仅当您使用人形装备时,此事件才会执行。
  • StateMachineBehaviour(OnStateIK):这是在具有 StateMachineBehaviour 组件的每个活动状态上调用的,该组件在启用了 IK pass 的层上定义此回调。

 

具体分析

我们获取动画状态信息,实际上不应该放在Update

根据unity的生命周期 来看 动画相关的刷新是在Update之后 LateUpdate之前的。就是说我们切换一个动画,系统要等到AnimationUpdate时候才去刷新相关信息。如果把GetCurrentAnimatorStateInfo  :StateInfo 放到Update中获取的话 实际上差了顺序。比如说一个动画下一帧就要过渡到另一个动画。我们如果在下一帧的Update中GetNextAnimatorStateInfo  中获取stateInfo那么实际上动画机还没有开始过渡,就是说动画信息此时还在过渡起始帧的前一帧。在Update之后的AnimationUpdate才会刷新,才会刚开始过渡(过渡起始帧)到另一个动画。

所以我们应该把获取StateInfo的行为放到AnimationUpdate之后 即LateUpdate,这样才能保证动画信息已经刷新了,此时获取的信息才是当前此刻的正确信息。如下图

作者:Miracle
来源:麦瑞克博客
链接:https://www.unitymake.com/archives/unity/1362
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
THE END
分享
打赏
海报
Unity动画生命周期-internal animation update|解决动画信息不正确问题
前言 Unity脚本从唤醒到销毁有着一套比较完善的生命周期,动画系统的回调函数也有着自己独立的生命周期,它类似Unity框架中Update与LateUpdate生命周期。我们获……
<<上一篇
下一篇>>
文章目录
关闭
目 录