Unity中Animation Clip重置GameObject位置编程播放失效问题
动画状态未强制从第一帧启动
运行时通过Animator播放动画时,若没明确指定从第0帧开始,可能会延续之前动画的进度,导致不会回到第一帧的位置——但编辑器里直接播放动画默认是从头启动,所以没问题。
解决:播放动画时强制重置到第一帧,用以下代码:// 直接播放,无过渡 animator.Play("SlabIdle", -1, 0f); // 或者无过渡切换状态 animator.CrossFade("SlabIdle", 0f);动画过渡存在混合效果
如果Animator状态机里,从当前状态到SlabIdle的过渡设置了非0的过渡时间或Exit Time,会导致两个状态的动画混合,位置不会被SlabIdle完全覆盖。编辑器里播放单个动画剪辑没有过渡混合,所以表现正常。
解决:把SlabIdle状态的过渡设置改为Exit Time = 0、Transition Duration = 0,确保切换时立即生效,无混合效果。Animator的Update Mode与脚本时机冲突
若Animator的Update Mode设为Animate Physics,而你移动Slab的代码在Update里执行,两者更新时机不同步,可能导致动画的位置修改被脚本的移动操作覆盖,或者反过来。
解决:把Animator的Update Mode改成Normal,或者统一代码和动画的更新时机(比如把移动代码放到FixedUpdate里)。脚本未停止对Transform的修改
按B键移动到Target的代码如果还在持续执行(比如每帧都设置position),即使播放了SlabIdle动画,动画的位置修改也会被脚本的持续赋值覆盖。编辑器里播放动画时不会运行你的移动脚本,所以没问题。
解决:按A键播放动画时,添加开关变量停止移动代码的执行,示例:bool isMoving = false; public Transform target; private Animator animator; void Start() { animator = GetComponent<Animator>(); } void Update() { if (Input.GetKeyDown(KeyCode.B)) { isMoving = true; } if (Input.GetKeyDown(KeyCode.A)) { isMoving = false; animator.Play("SlabIdle", -1, 0f); } if (isMoving) { transform.position = target.position; } }动画剪辑的Root Motion设置异常
如果动画剪辑开启了Root Motion(Bake Into Pose),且Animator的Apply Root Motion也开启,动画的位置变化会通过根运动计算,可能导致位移累积或未正确应用关键帧位置——编辑器里播放动画的Root Motion处理逻辑和运行时状态机有差异。
解决:检查动画剪辑的Root Motion设置,把Root Transform Position设为Original,或者关闭Animator的Apply Root Motion,让动画直接修改Transform的位置。
内容的提问来源于stack exchange,提问作者JaiS

