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

Unity OnTriggerStay2D触发器不生效 无编译错误问题排查

故障原因
  • 子对象碰撞体事件传递问题:Unity 2D物理系统中,若碰撞体所在物体未挂载Rigidbody2D,触发事件会向上传递到挂载了Rigidbody2D的父物体,此时回调传入的Collider2D引用是父物体的碰撞体而非带"Draft"标签的子对象碰撞体,标签判断自然失效。
  • 原有逻辑存在漏洞:OnTriggerStay2D会在接触范围内每物理帧对所有接触的碰撞体分别触发回调,只要某一次回调传入的是其他非Draft碰撞体,就会把isCarDrafting错误重置为false,哪怕此时仍处于Draft碰撞范围内。
  • 基础配置漏校验:触发检测生效需要满足前置条件,任意一项不满足都会导致回调完全不触发。
修复方案

1. 修正碰撞体配置

给挂载了"Draft"标签BoxCollider2D的子物体单独添加Rigidbody2D组件,做如下配置:

  • 将Body Type设置为Kinematic
  • 勾选Is Kinematic选项
  • 将Gravity Scale设为0,避免子物体受重力影响移位
    这个配置会让子对象的碰撞体作为独立触发体存在,触发事件会正确命中带"Draft"标签的碰撞体,不会向上传递给父物体。

2. 替换触发逻辑

弃用OnTriggerStay2D做状态判断,改用OnTriggerEnter2D和OnTriggerExit2D精准控制状态,避免多碰撞体干扰,同时用CompareTag替代直接字符串相等判断(tag拼写错误时会直接抛出错误,不会静默失效):

public bool isCarDrafting;

void OnTriggerEnter2D(Collider2D colDraft)
{   
    if (colDraft.CompareTag("Draft"))
    {
        isCarDrafting = true;
    }
}

void OnTriggerExit2D(Collider2D colDraft)
{
    if (colDraft.CompareTag("Draft"))
    {
        isCarDrafting = false;
    }
}

3. 前置配置校验

逐一确认以下配置,避免基础规则导致触发失效:

  • 带"Draft"标签的BoxCollider2D上已勾选Is Trigger选项
  • 两个发生接触的碰撞体,至少有一个挂载了Rigidbody2D(按步骤1给Draft子物体加完刚体就满足要求)
  • 打开Project Settings > Physics 2D,确认Layer Collision Matrix中,车辆所在层和Draft碰撞体所在层的碰撞关系是勾选状态,没有被排除
  • 如果Draft碰撞体跟随父物体高速移动,将对应Rigidbody2D的Collision Detection模式改为Continuous,避免高速移动导致的穿模漏检。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:33:40