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

Unity攻击时碰撞器翻转异常问题求助

问题分析与解决方案

你的核心问题是误用全局坐标(transform.position)调整子物体位置,碰撞器作为玩家的子物体,必须用局部坐标(transform.localPosition)控制,才能保证所有偏移都是相对于玩家自身的,不会出现绕全局轴翻转的异常。另外当前代码里判断attackOffset.y正负的逻辑完全错误——attackOffset存储的是全局位置,和玩家自身的朝向、偏移毫无关联。

修正思路

  • 放弃全局坐标,改用**局部坐标(localPosition)**管理碰撞器相对于玩家的位置
  • 预先存储碰撞器的初始局部偏移,避免每次读取全局位置
  • 直接根据攻击方向设置对应的局部偏移,不需要判断全局位置的正负

修改后的代码

using UnityEngine;

public class VerticalSword : MonoBehaviour
{
    Collider2D AttackColliderVertical;
    // 存储碰撞器相对于玩家的初始局部偏移
    Vector2 initialLocalOffset;

    private void Start()
    {
        AttackColliderVertical = GetComponent<Collider2D>();
        // 记录初始局部位置(相对于父物体玩家的偏移)
        initialLocalOffset = transform.localPosition;
        AttackColliderVertical.enabled = false;
    }

    public void AttackUp()
    {
        AttackColliderVertical.enabled = true;
        // 设置向上攻击的局部位置:保持x偏移,y偏移用初始值的正方向
        transform.localPosition = new Vector2(initialLocalOffset.x, Mathf.Abs(initialLocalOffset.y));
        print("Attack up successful");
    }

    public void AttackDown()
    {
        AttackColliderVertical.enabled = true;
        // 设置向下攻击的局部位置:保持x偏移,y偏移用初始值的负方向
        transform.localPosition = new Vector2(initialLocalOffset.x, -Mathf.Abs(initialLocalOffset.y));
        print("Attack down successful");
    }

    public void StopAttack()
    {
        AttackColliderVertical.enabled = false;
        // 攻击结束后重置回初始位置(可选)
        transform.localPosition = initialLocalOffset;
    }
}

额外优化建议

  • 如果攻击需要的是碰撞器镜像翻转而非位置偏移,可以直接修改transform.localScale的y值,比如transform.localScale = new Vector3(1, -1, 1),这种方式更高效
  • 可以把攻击偏移值做成可序列化变量(添加[SerializeField]),直接在Unity编辑器里调整,不用硬编码

内容的提问来源于stack exchange,提问作者Wizard Gamireal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:20:23