关于动画融合

StateMachineBehaviour中OnStateEnter在融合开始时调用,OnStateExit在融合结束时调用

例子 State A: stand   State B: walk,  A->B 融合0.1s

融合开始前,现在处于A,则Animator.GetCurrentAnimatorClipInfo会获取A中的clips,Animator.GetCurrentAnimatorStateInfo会获取状态A,相对应的GetNextAnimatorClipInfo和GetNextAnimatorStateInfo则不会获取任何值

融合开始时,B的OnStateEnter调用,Animator.GetCurrentAnimatorClipInfo会获取A中的clips,Animator.GetCurrentAnimatorStateInfo会获取状态A,相对应的GetNextAnimatorClipInfo和GetNextAnimatorStateInfo会获取B

融合结束时,A的OnStateExit调用,之后Animator.GetCurrentAnimatorClipInfo会获取B中的clips,Animator.GetCurrentAnimatorStateInfo会获取状态B,相对应的GetNextAnimatorClipInfo和GetNextAnimatorStateInfo不会获取值

 

注意:Exit Time 是百分比

当A切换到B时,如果正处在融合中,那么当前状态实际为A,则从B切换到其他状态的行为都会等待融合结束才会进行,若想提前进行则需要设置打断Animator- Interruption Source用法 - 知乎 (zhihu.com)

A切换到B时,注意融合时间不要过长,如果超过或接近B的clip时长,会压缩B向下一个状态的融合时间。原理见上一条(从B切换到其他状态的行为都会等待融合结束才会进行),当A到B的融合结束时,整个B的clip都已经结束了,就不会再触发B到下一个状态的融合了。可以在A到B上设置打断为next解决此问题,或直接减少A到B的融合时间

一个例外:从AnyState出去的转换是不会被打断的,需要注意

 

发现的异常情况:Unity 2020.3.19f1c2

有A->B->C,如果A->B的Interruption Source 设置为Next State,当B->C打断生效,进入播放C且还没有与其他状态融合时,Animator.GetNextAnimatorStateInfo没有返回值(正常,因为没有与其他状态融合),但是Animator.GetNextAnimatorClipInfo会返回状态A的clip(异常)

posted on 2022-04-12 16:29  littleLong  阅读(198)  评论(0)    收藏  举报

导航