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

关于getcontact的咨询及Unity玩家撞墙方向判断异常问题

问题解决与API说明

方向反转的原因与修正

你猜的没错——collision.GetContact(0).normal返回的是碰撞表面的法线方向,且是基于世界坐标系、指向墙体外部的:

  • 右侧墙体的法线方向是向左(x轴负方向),所以你原本的逻辑会输出"left"
  • 左侧墙体的法线方向是向右(x轴正方向),所以会输出"right"

有两种修正方式:

  1. 直接反转判断逻辑
private void OnCollisionEnter2D(Collision2D collision)
{
    if(collision.gameObject.tag == "Wall")
    {
        Vector2 direction = collision.GetContact(0).normal;

        if (direction.x >= 0)
        {
            Debug.LogError("left"); // 撞到左侧墙,法线向右
        }

        if (direction.x <= 0)
        {
             Debug.LogError("right"); // 撞到右侧墙,法线向左
        }
    }
}
  1. 转换为玩家本地坐标系(更适配玩家旋转的场景)
    把世界空间的法线转换为玩家自身的坐标系,这样判断的就是玩家视角下的左右:
private void OnCollisionEnter2D(Collision2D collision)
{
    if(collision.gameObject.tag == "Wall")
    {
        Vector2 localNormal = transform.InverseTransformDirection(collision.GetContact(0).normal);

        if (localNormal.x >= 0)
        {
            Debug.LogError("right");
        }

        if (localNormal.x <= 0)
        {
             Debug.LogError("left");
        }
    }
}

关于GetContact的补充说明

  • Collision2D.GetContact(int index)用于获取碰撞中的单个接触点信息,index从0开始计数
  • 两个物体碰撞可能产生多个接触点(比如角色斜撞墙面),可以用collision.contactCount获取当前碰撞的总接触点数量,避免索引越界
  • 每个接触点包含核心数据:
    • normal:碰撞表面的法线向量(世界坐标系,始终指向碰撞体的外部)
    • point:接触点在世界空间中的坐标
    • separation:两个碰撞体在接触点处的分离距离(负数表示重叠)

内容的提问来源于stack exchange,提问作者Mr.Bang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:22:58