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

Unity OnTriggerEnter2D(Collider2D col)触发判断逻辑异常排查

问题产生原因

你的判断条件存在布尔逻辑运算符使用错误,这是导致逻辑完全不符合预期的核心原因:

  • 你当前使用的是逻辑或运算符||,该运算符的规则是:只要两侧的任意一个表达式结果为true,整个条件就返回true。
  • 对任意进入触发器的碰撞对象,这个条件永远成立:
    • 当碰撞对象标签为player时:col.gameObject.tag != "player"结果为false,但col.gameObject.tag != "fireball"结果为true,整体条件为true,会进入销毁逻辑
    • 当碰撞对象标签为fireball时:col.gameObject.tag != "player"结果为true,不管另一侧表达式结果是什么,整体条件直接为true,会进入销毁逻辑
    • 当碰撞对象为其他标签时:两个判断表达式结果均为true,整体条件还是true

等于你写的判断没有起到任何过滤作用,挂载脚本的对象碰到任何带碰撞体的触发器对象都会被销毁,和你预期的“只过滤掉player和fireball”的逻辑完全相反。

修复方法

将条件中的逻辑或运算符||替换为逻辑与运算符&&即可,只有当碰撞对象标签既不是player、也不是fireball时,两个判断表达式才会同时为真,整体条件成立,触发销毁逻辑。
修正后的基础代码如下:

void OnTriggerEnter2D(Collider2D col)
{
    if (col.gameObject.tag != "player" && col.gameObject.tag != "fireball")
    {
        Debug.Log(col.gameObject.tag);
        Destroy(gameObject);
    }
}

可选优化:Unity中推荐使用CompareTag()方法做标签判断,相比直接字符串相等判断性能更好,还能在你拼写了不存在的标签时直接抛出报错,避免静默的逻辑错误,优化后代码:

void OnTriggerEnter2D(Collider2D col)
{
    if (!col.CompareTag("player") && !col.CompareTag("fireball"))
    {
        Debug.Log(col.gameObject.tag);
        Destroy(gameObject);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:09:23