Unity中Animator.Play()平滑过渡实现及CrossFade停帧问题解决
首先明确:CrossFade完全可行,它就是Unity官方提供的、用于无过渡连接动画状态间平滑切换的API,比直接调用Animator.Play()更适合实现淡入淡出的过渡效果。
针对你遇到的“切换到第一帧就停止”的问题,按以下步骤排查解决:
确认图层参数正确
若Animator使用了分层,调用CrossFade时必须指定对应动画状态所在的图层索引(第四个参数,默认-1代表基础层)。图层不匹配会导致状态切换异常,表现为动画停帧。
示例代码:// 基础层切换到"Idle"动画,过渡0.3秒 animator.CrossFade("Idle", 0.3f); // 切换到索引为1的自定义图层中的"Attack"动画 animator.CrossFade("Attack", 0.2f, 1);设置合理的过渡时长
若fadeDuration设为0,CrossFade等价于直接Play(),还可能触发状态切换bug。务必设置大于0的过渡时长(通常0.2~0.5秒),给动画足够的淡入时间。正确使用normalizedTime参数
CrossFade的第四个参数normalizedTime默认值为0,会强制目标动画从第一帧开始播放。如果需要基于当前动画的进度对齐目标动画的播放位置(比如循环动画切换),可将该参数设为float.NegativeInfinity:// 基于当前进度过渡到"Run"动画 animator.CrossFade("Run", 0.3f, -1, float.NegativeInfinity);检查Animator更新模式
若Animator的Update Mode设为Animate Physics,但CrossFade调用在Update而非FixedUpdate中,会导致动画更新不同步,出现停帧。可将更新模式改回Normal,或移至FixedUpdate中调用切换逻辑。验证动画状态配置
检查目标动画状态的Speed参数是否为1(Animator窗口中选中状态查看),同时确认对应的Animation Clip是否正常(Loop Time是否符合需求,片段本身没有损坏)。
内容的提问来源于stack exchange,提问作者Wogie Bear

