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

Unity中2D碰撞检测OnCollisionEnter2D不生效,求排查原因

2D碰撞检测未触发的排查方向

先贴出你的代码:

void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.tag == "Ground/Floor")
    {
        
        Debug.Log("touched floor");
    }
}

以下是可能导致日志不输出的原因,按排查优先级排序:

  • 标签完全匹配问题:
    检查Tilemap的GameObject标签是否和代码里的Ground/Floor完全一致——包括大小写、斜杠、有没有多余空格。Unity的标签区分大小写,比如ground/floor和Ground/Floor会被判定为不同标签。另外要确认标签是加在Tilemap的根对象上,不是单个Tile(单个Tile无法设置标签,碰撞检测的是Tilemap对象本身)。

  • 碰撞组件配置错误:

    • 角色对象必须带有非触发器的Collider2D组件(比如CapsuleCollider2D),如果勾选了Is Trigger,OnCollisionEnter2D不会触发,要改用OnTriggerEnter2D。
    • Tilemap对象必须带有Tilemap Collider 2D组件,同样不能勾选Is Trigger。如果你的Tilemap是不规则地形,需要搭配Composite Collider 2D,记得勾选Tilemap Collider 2D的Used By Composite选项。
  • 刚体组件缺失:
    Unity 2D碰撞系统要求碰撞双方至少有一个带有Rigidbody2D组件。角色作为可移动对象,应该添加Rigidbody2D,并将Body Type设置为Dynamic(静态刚体不会触发碰撞事件)。如果Tilemap设置了Static,角色必须带Rigidbody2D才能触发碰撞回调。

  • 代码挂载位置错误:
    确认脚本是挂载在角色GameObject上,而不是Tilemap或其他无关对象。OnCollisionEnter2D是挂载在发生碰撞的对象上才会被调用,这里只有角色碰撞到地面时,角色身上的脚本才会触发这个方法。

  • 层碰撞矩阵限制:
    打开Edit -> Project Settings -> Physics 2D,查看Layer Collision Matrix,确认角色所在的层和Tilemap所在的层是允许相互碰撞的,没有取消勾选对应的碰撞选项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:40:02