Unity动画结束后对象返回初始位置,如何使其停在最终位置?
解决动画结束后返回初始位置的问题
一、核心解决方案(针对Animator组件)
1. 修改动画片段的基础设置
打开你的动画片段(.anim文件),在Inspector面板里做两个调整:
- 取消勾选Loop Time,避免动画循环播放;
- 将Wrap Mode设置为
ClampForever,这样动画播放到最后一帧就会停住,不会倒退回初始状态。
2. 关闭Animator状态的「Write Defaults」
在Animator窗口中找到播放该动画的状态,在Inspector面板里取消勾选Write Defaults。这个选项会在状态退出时把对象属性重置为默认值,取消后就能保留动画最后一帧的位置和旋转。
3. 添加动画事件锁定Transform
如果上面的方法不生效,可以给动画添加结束事件,手动锁定对象的最终状态:
- 打开动画片段,在时间轴的最后一帧右键选择「Add Animation Event」;
- 在脚本中添加如下回调方法:
public void LockFinalState() { // 锁定当前位置和旋转 var finalPos = transform.position; var finalRot = transform.rotation; transform.position = finalPos; transform.rotation = finalRot; // 禁用Animator,防止后续状态影响 _animator.enabled = false; } - 把这个方法拖到Animation Event的「Function」字段中,动画结束时就会触发锁定。
二、Animation与Animator组件的区别
- Animation组件:Unity旧版动画系统,适合简单线性动画(比如单个循环动画)。它直接管理动画片段的播放、暂停、循环模式,不需要状态机。现在主要用于兼容旧项目,新项目不推荐使用。
- Animator组件:Unity Mecanim动画系统,基于状态机(State Machine),适合复杂动画逻辑(比如角色多状态切换)。通过Animator Controller管理多个动画状态和过渡,支持参数(Trigger、Bool等)触发切换,是当前Unity的主流动画方案。
- 两者关联:Animator可以包含多个Animation片段,通过状态机控制播放逻辑;而Animation组件只能直接操控片段,没有状态切换能力。
关于ApplyRootMotion的说明
开启Animator.ApplyRootMotion后,动画的根运动位移会直接作用于对象Transform,导致动画从当前位置开始播放(而非你设置的初始位置)。如果你的动画是基于绝对位置制作的,应该关闭ApplyRootMotion,确保动画按预设的初始→最终位置执行。
内容的提问来源于stack exchange,提问作者dkalkwarf
相关产品推荐
相关产品推荐

