记一次Animator状态快速切换问题的解决
我尝试在一帧内多次切换一些状态(当前状态为Idle的情况下):
public Animator animator; void OnEnable() { animator.CrossFade("BeAttack1", 0.2f); animator.CrossFade("Idle", 0.2f); }
但结果并非播放Idle,而是播放BeAttack1。
在Animator刷新前,它所播放的是最后一次调用接口的信息,谁排在后执行谁。
并且当一个状态处于过渡时,Animator默认这个状态还没有跳转,只有过渡完成才算跳转到另一个状态
下面这幅图说明了这个问题:
Animation有一个动画队列可以解决这个问题,而Animator取消了动画队列。
而用协程的话又会变得非常麻烦,于是我想到了用Animator.Update来解决:
public static void ForceCrossFade(this Animator animator, string name, float transitionDuration, int layer = 0, float normalizedTime = float.NegativeInfinity) { animator.Update(0); if (animator.GetNextAnimatorStateInfo(layer).fullPathHash == 0) { animator.CrossFade(name, transitionDuration, layer, normalizedTime); } else { animator.Play(animator.GetNextAnimatorStateInfo(layer).fullPathHash, layer); animator.Update(0); animator.CrossFade(name, transitionDuration, layer, normalizedTime); } }
我写了一个CrossFade的扩展,强制调用Update,如果当前没有下一个动画跳转则直接混合,如果有就强制切到跳转然后混合。
调用测试脚本:
void OnEnable() { animator.ForceCrossFade("BeAttack1", 0.2f); animator.ForceCrossFade("Idle", 0.2f); }
OK,测试无误,最后又回到了Idle:
注意:ForceCrossFade不能在SMB里的Update中调用,否则会死循环,如果一定要调用需要加一个标记判断
分类:
Unity3D
标签:
UnityAnimator
, Coroutine
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2015-02-17 scut协议配置工具初始化的一些问题