You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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缩放计算,同时优化重复查找对象的性能问题:

  1. 先在类的成员变量区域声明缓存引用,避免每次执行逻辑时重复查找:
[SerializeField] private Transform weaponHolder;
[SerializeField] private SpriteRenderer handRenderer;
private bool facingRight = true; // 按实际默认朝向初始化
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 17:06:08