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

Unity中OnCollisionEnter2D方法未触发的问题求助

Unity中OnCollisionEnter2D不触发的排查与解决方法

先确认脚本是否正常运行

  • 打开tableBox的Inspector面板,检查挂载的脚本组件前的复选框是否勾选,未勾选的话脚本不会执行
  • 在脚本里添加Start()方法验证加载状态:
    void Start()
    {
        Debug.Log("Table脚本已启动");
    }
    
    运行游戏后查看控制台,若无输出,说明脚本未正确加载——检查脚本是否挂载到错误对象,或脚本文件名与类名是否完全一致(Unity要求两者必须同名)

碰撞检测核心条件排查

  • Collider的Trigger状态检查:两个物体的BoxCollider2D都不能勾选Is Trigger,勾选后会进入触发模式,仅会调用OnTriggerEnter2D,不会触发OnCollisionEnter2D
  • Rigidbody2D设置验证:
    • customer的Rigidbody2D必须设为Dynamic(再次确认未改回其他类型)
    • tableBox的Rigidbody2D可设为Static或Kinematic,但如果两个物体均为Kinematic,必须给其中一个开启Use Full Kinematic Contacts选项,否则无法触发碰撞
    • 禁止两个物体的Rigidbody2D都设为Static,Static物体之间不会触发任何碰撞检测
  • 标签与代码匹配检查:
    • 确认customer对象的标签确实是customer(Unity标签区分大小写,注意拼写细节)
    • 代码中改用collision.gameObject.CompareTag("customer")替代直接比较tag,该方法会自动处理空对象与拼写错误,更可靠
  • 层级碰撞矩阵检查:
    打开Edit > Project Settings > Physics 2D,找到Layer Collision Matrix,确认customer和tableBox所在层级的碰撞权限已勾选,未勾选的话两个层级的物体不会触发碰撞

修正后的示例代码

void Start()
{
    Debug.Log("Table脚本已启动");
}

void OnCollisionEnter2D(Collision2D collision)
{
    Debug.Log("进入OnCollisionEnter2D方法");
    
    if(collision.gameObject.CompareTag("customer"))
    {
        Debug.Log("检测到customer碰撞!");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:06:37