Unity 2D 角色翻转时如何实现子物体Y轴缩放的双向切换
问题根因
你修改weaponHolder缩放的逻辑中,错误将父级Player节点的Y缩放作为计算基准,而非weaponHolder自身的当前缩放值。
举个实例:假设Player默认localScale为(1,1,1),第一次调用Flip时,weaponHolder的Y轴会被设为1*-1=-1;第二次调用Flip时,代码仍然取Player的Y值(始终为1)计算,结果还是-1,缩放永远无法切回正值,自然只能完成一次翻转。
修复方案
两种实现方式可按需选择:
方案1:基于自身当前缩放取反(改动量最小)
将Flip方法中修改weaponHolder缩放的逻辑,改为基于自身当前的Y缩放计算,同时优化重复查找对象的性能问题:
- 先在类的成员变量区域声明缓存引用,避免每次执行逻辑时重复查找:
[SerializeField] private Transform weaponHolder; [SerializeField] private SpriteRenderer handRenderer; private bool facingRight = true; // 按实际默认朝向初始化
- 修改
Flip方法:
void Flip() { facingRight = !facingRight; GetComponent<SpriteRenderer>().flipX = !facingRight; handRenderer.flipY = !facingRight; // 核心修改:使用weaponHolder自身的Y缩放值计算 float currentYScale = weaponHolder.localScale.y; weaponHolder.localScale = new Vector3( weaponHolder.localScale.x, currentYScale * -1, weaponHolder.localScale.z ); }
方案2:直接根据朝向固定缩放值(更稳定)
如果没有其他逻辑会修改weaponHolder的缩放,推荐直接根据facingRight的状态指定对应的Y缩放,不会出现状态累积误差:
void Flip() { facingRight = !facingRight; GetComponent<SpriteRenderer>().flipX = !facingRight; handRenderer.flipY = !facingRight; // 按实际需求可调整1、-1对应的朝向,若默认缩放非1直接替换对应值即可 weaponHolder.localScale = new Vector3( weaponHolder.localScale.x, facingRight ? 1f : -1f, weaponHolder.localScale.z ); }
额外优化建议
- 废弃
GameObject.Find("Hand"):要么直接在Inspector中拖拽赋值handRenderer,要么在Start方法中一次性缓存引用,避免高频调用时遍历场景产生性能损耗。 - 合并重复的翻转判断逻辑,删除冗余分支:
// 替换原有的两个if/else分支 if ((facingRight == false && movement.x > 0) || (facingRight == true && movement.x < 0)) { Flip(); }
内容的提问来源于stack exchange,提问作者Sam Andersson
相关产品推荐
相关产品推荐

