Unity中Timeline动画播放时如何保持Player Controls生效?
解决Unity Timeline动画播放时玩家控件失效的问题
核心原因
Timeline动画默认会在Update阶段修改Transform属性,且优先级高于普通脚本的Update逻辑,导致脚本对玩家位置的修改被动画帧覆盖,只有动画结束后脚本才能生效。
解决方案
1. 关闭动画片段的Write Defaults
- 双击Timeline中的目标动画片段,进入动画编辑器
- 在Inspector面板找到Write Defaults选项,设置为Off
- 此设置会让动画仅修改关键帧定义的属性,不会覆盖脚本对其他属性(比如X轴位置)的修改
2. 调整脚本执行顺序
- 打开
Edit > Project Settings > Script Execution Order - 将
PlayerControls脚本的执行顺序数值设为大于Animator的数值(数值越大,执行时机越晚) - 确保脚本对位置的修改在动画更新之后执行,覆盖动画的结果
3. 使用LateUpdate替代Update
修改脚本,将位置逻辑移到LateUpdate中,确保在所有动画更新完成后再处理玩家输入:
using UnityEngine; public class PlayerControls : MonoBehaviour { [SerializeField] float controlSpeed = 10f; void LateUpdate() { float xThrow = Input.GetAxis("Horizontal"); float xOffset = xThrow * Time.deltaTime * controlSpeed; float newXPos = transform.localPosition.x + xOffset; transform.localPosition = new Vector3(newXPos, transform.localPosition.y, transform.localPosition.z); } }
4. 采用Additive动画混合模式(适用于Animator轨道)
如果Timeline使用的是Animator轨道而非直接Transform轨道:
- 在Animator Controller中新建动画层,设置Blend Mode为Additive
- 将Timeline动画分配到该层,动画位移会与脚本控制的位移叠加,而非覆盖
内容的提问来源于stack exchange,提问作者Siddharth Ramesh
相关产品推荐
相关产品推荐

