关于getcontact的咨询及Unity玩家撞墙方向判断异常问题
问题解决与API说明
方向反转的原因与修正
你猜的没错——collision.GetContact(0).normal返回的是碰撞表面的法线方向,且是基于世界坐标系、指向墙体外部的:
- 右侧墙体的法线方向是向左(x轴负方向),所以你原本的逻辑会输出"left"
- 左侧墙体的法线方向是向右(x轴正方向),所以会输出"right"
有两种修正方式:
- 直接反转判断逻辑
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"); // 撞到右侧墙,法线向左 } } }
- 转换为玩家本地坐标系(更适配玩家旋转的场景)
把世界空间的法线转换为玩家自身的坐标系,这样判断的就是玩家视角下的左右:
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
相关产品推荐
相关产品推荐

