如何让动画播放结束后停留在最后一帧不重新播放?
解决方法
这是Unity Animator动画结束后姿态复位的常见问题,按以下步骤操作即可实现动画停留在最后一帧的效果,不需要开启循环:
基础设置修复(覆盖90%场景)
- 选中项目中的指向动画剪辑资源,在Inspector导入设置中找到
Wrap Mode,设置为Clamp Forever
该模式下动画播放到末尾后会持续保持最后一帧的所有骨骼姿态,既不会循环重播,也不会复位到初始绑定姿势 - 打开Animator窗口,选中播放指向动画的State,取消勾选
Write Defaults选项绝大多数动画播放完成后复位的问题都由
Write Defaults导致:该选项开启时,Animator会在当前状态退出/播放结束后,自动将所有骨骼属性重置为Avatar的默认绑定姿势,也就是你观察到的动画播完手部垂落复位的现象。 - 不需要开启Loop Time、Loop Pose,也不需要额外修改Root Transform的Bake相关设置,这些配置只对循环动画、根运动动画生效,和保持最后一帧姿态无关,这也是你之前尝试的操作没有生效的核心原因。
代码控制方案(适配动态触发场景)
如果你的指向动画是运行时动态触发、需要和逻辑状态联动的,可以通过StateMachineBehaviour直接控制动画停在最后一帧,不需要修改资源导入设置,代码如下:
using UnityEngine; public class KeepAnimationLastFrame : StateMachineBehaviour { public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // 触发时动画从头开始播放 animator.Play(stateInfo.fullPathHash, layerIndex, 0f); } public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // 动画播放完成后将进度固定在最后一帧位置 if (stateInfo.normalizedTime >= 1f) { animator.Play(stateInfo.fullPathHash, layerIndex, 1f); } } }
- 将该脚本挂载到Animator中对应的指向动画State上即可生效。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

