Unity中Animator组件干扰角色翻转代码,Transform无法更新
问题分析与解决方案
你遇到的核心问题是Animator组件会覆盖Transform的属性修改——当动画片段包含Scale关键帧,或是开启了Root Motion功能时,代码手动修改localScale的操作会被Animator的帧更新覆盖。
快速排查与解决步骤
1. 检查动画片段的关键帧
打开角色所有用到的动画Clip(比如Idle、Run等),在动画编辑器里查看是否存在对Transform.localScale.x的关键帧设置。如果有,直接删除这些关键帧——动画会持续强制设置Scale值,导致代码修改完全无效。
2. 关闭Animator的「Apply Root Motion」
选中角色的Animator组件,取消勾选Apply Root Motion选项。开启该选项时,Animator会完全接管Transform的位置、旋转、缩放更新,代码的修改会被直接覆盖。
3. 改用Animator参数控制翻转(推荐)
如果需要保留Root Motion功能,可以用Animator的参数和镜像功能实现翻转,避免直接修改Scale:
- 在Animator Controller中添加一个布尔参数(比如
IsFacingRight) - 给所有需要翻转的动画状态开启Mirror选项(在状态机的Inspector面板中设置)
- 修改Flip函数,仅控制参数值让Animator自动处理镜像:
void Flip() { facingRight = !facingRight; animator.SetBool("IsFacingRight", facingRight); }
4. 调整代码执行时机
如果以上方法无效,尝试把Flip函数的调用逻辑移到LateUpdate()中执行,确保代码在Animator帧更新之后运行,避免被动画帧覆盖:
void LateUpdate() { // 示例:检测输入触发翻转 if (Input.GetKeyDown(KeyCode.A)) { Flip(); } } void Flip() { facingRight = !facingRight; Vector3 scaler = transform.localScale; scaler.x *= -1; transform.localScale = scaler; }
内容的提问来源于stack exchange,提问作者Sharpie
相关产品推荐
相关产品推荐

