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

Unity中OnCollisionEnter2D()无法检测碰撞问题求助

Unity 2D碰撞检测OnCollisionEnter2D无响应的解决思路

核心错误修正

你提到为玩家和其他对象启用了IsTrigger的BoxCollider2D——这是关键问题:当Collider2D开启IsTrigger时,Unity会触发触发事件(OnTriggerEnter2D系列),而非碰撞事件(OnCollisionEnter2D系列)。两种事件互斥,所以你的OnCollisionEnter2D完全不会被调用。

如果需要保留IsTrigger,把代码改成触发事件版本:

public void OnTriggerEnter2D(Collider2D other)
{
    Debug.Log("Trigger detected");
    if (other.gameObject.CompareTag("PuzzleWall"))
    {
        Debug.Log("Wall hit via trigger");
    }
}

如果不需要触发逻辑,直接关闭所有参与碰撞对象的IsTrigger选项,原代码即可正常触发。

针对z轴微小位移的排查

你提到对象在z轴有1e-6的位移,这在3D场景中的2D碰撞里是致命的:Unity的2D碰撞检测默认只在同一z平面(通常是z=0)进行检测,哪怕极微小的z轴偏移,都会让引擎判定两个2D碰撞体不在同一层级,从而忽略碰撞。

解决方法:

  • 手动将玩家和所有碰撞对象的z轴坐标设为完全相同的固定值(比如0);
  • 在Rigidbody2D的约束中,勾选Z轴位置锁定,彻底禁止z轴位移;
  • 检查是否有3D脚本或动画意外修改了对象的z轴属性。

额外排查点

  • 确认脚本挂载对象:脚本必须挂载在带有Rigidbody2D和Collider2D的玩家对象上,不能挂载在空对象或其他无关节点;
  • 检查Rigidbody2D设置:确保没有误勾选Kinematic(运动学刚体不会触发动态碰撞),同时Body Type保持Dynamic;
  • 验证碰撞器有效性:在Scene视图中开启碰撞器的可视化,确认玩家和墙的碰撞器确实会发生重叠;
  • 检查方法签名:确保OnCollisionEnter2D的拼写和参数完全正确(大小写、参数类型Collision2D不能错),Unity的消息系统对签名非常敏感。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:22:52