记一次Animator状态快速切换问题的解决
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次Animator状态快速切换问题的解决相关的知识,希望对你有一定的参考价值。
事情是这样的,我尝试在一帧内多次切换一些状态:
public Animator animator; void OnEnable() { animator.CrossFade("BeAttack1", 0.2f); animator.CrossFade("Idle", 0.2f); }
但结果并非播放Idle,而是播放BeAttack1。
在Animator刷新前,它所播放的是最后一次调用接口的信息,谁排在后执行谁。
并且当一个状态处于过渡时,Animator默认这个状态还没有跳转,只有过渡完成才算跳转到另一个状态(具体看这篇:http://www.cnblogs.com/hont/p/4786462.html)
下面这幅图说明了这个问题:
Animation有一个动画队列可以解决这个问题,而Animator取消了动画队列。
而用协程的话又会变得非常麻烦,于是我想到了用Animator.Update来解决:
public static void ForceCrossFade(this Animator animator, string name, float transitionDuration) { animator.Update(0); if (animator.GetNextAnimatorStateInfo(0).fullPathHash == 0) { animator.CrossFade(name, 0.2f); } else { animator.Play(animator.GetNextAnimatorStateInfo(0).fullPathHash); animator.Update(0); animator.CrossFade(name, 0.2f); } }
我写了一个CrossFade的扩展,强制调用Update,如果当前没有下一个动画跳转则直接混合,如果有就强制切到跳转然后混合。
调用测试脚本:
void OnEnable() { animator.ForceCrossFade("BeAttack1", 0.2f); animator.ForceCrossFade("Idle", 0.2f); }
OK,测试无误,最后又回到了Idle:
以上是关于记一次Animator状态快速切换问题的解决的主要内容,如果未能解决你的问题,请参考以下文章
Animator 动画第一次播放正常,之后播放都不正常的问题解决
记一次通过Memory Analyzer分析内存泄漏的解决过程