Unity中挂载Animator组件后运行时修改localScale无效
问题根因
挂载Animator组件后修改localScale不生效,核心原因是当前Animator播放的动画剪辑包含Transform组件Scale属性的关键帧绑定。Animator会在每帧动画评估阶段,将Scale属性强制覆写为动画曲线定义的值,无论是脚本修改还是Inspector面板手动调整的数值,都会在下一帧被动画逻辑覆盖。
添加动画前翻转功能正常、添加动画后手动改Inspector缩放值也无效,是该问题的典型表现。
解决方案
按需选择以下任意一种方案即可修复:
- 移除动画的Scale属性通道
打开Animator状态机中所有运行时会播放的动画剪辑,在动画编辑窗口的属性列表找到Transform > Scale通道,删除该通道下的全部关键帧。操作完成后Animator不再主动覆写Scale属性,原有翻转代码可直接正常运行。注意:2D项目制作动画时,即使从未主动调整过缩放值,也很容易误记录默认Scale(1,1,1)的关键帧,必须检查所有关联的动画片段,漏删任意一个动画的Scale通道都会导致问题复现。
- 拆分对象层级
给当前挂载Animator的角色对象创建一个空父物体,将Rigidbody2D、朝向翻转脚本挂载到这个空父物体上,Animator仅负责控制子物体的动画表现。父物体的Transform属性不会被子物体的Animator影响,直接修改父物体的localScale即可实现朝向翻转,无需改动任何已有动画资源,是项目中最常用的稳定方案。 - 调整逻辑执行顺序(临时方案)
如果暂时不想改动动画资源也不想拆分层级,可以把翻转逻辑从FixedUpdate移到LateUpdate中执行。LateUpdate的执行时机在Animator每帧动画评估之后,这里修改的Scale值会保留到当前帧渲染完成,不会被动画覆写。但该方案如果后续动画中存在Scale动态变化的逻辑,会出现表现冲突,仅适合临时调试使用。
额外优化建议:输入检测、朝向翻转这类表现层逻辑不适合写在FixedUpdate中,FixedUpdate是固定时间步的物理帧,和渲染帧不同步,即使不存在Animator覆写问题,也容易出现翻转延迟、手感不一致的问题,建议将这类逻辑挪到Update或LateUpdate中执行。
内容的提问来源于stack exchange,提问作者draxex
相关产品推荐
相关产品推荐

