【问题标题】:How do I check the tag of a GameObject when I collide with it?与 GameObject 碰撞时如何检查它的标签?
【发布时间】:2026-02-17 06:40:01
【问题描述】:

我的代码是:

    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.CompareTag ("bullet"))
        {
            UI.lives--;
        }
        if (collision.gameObject.tag == "life")
        {
            UI.livePart++;
        }
    }

我尝试了两种不同的方法来使其正常工作,但实际上都不能正常工作。 对于第一个,当我的玩家对象第一次与带有“子弹”标签的游戏​​对象发生碰撞时,它应该将我的“生命”整数减 1。

对于第二个,当它第一次与标签为“life”的游戏对象发生碰撞时,它应该将另一个整数“livePart”加 1。

UI 是存储变量“lives”和“livePart”的代码。

【问题讨论】:

  • 你添加 Collider 组件了吗?
  • @TimChang 是的,他们都有对撞机。
  • 您是否检查过OnCollisionEnter ( ... ) 确实被调用了,并且Collider 组件上没有选择isTrigger!!!!如果这些检查正确执行,那么第一个 if clause 似乎是最好的方法:-)
  • @nIcEcOw 我需要一个刚体才能让对撞机工作吗?如果不是,那么它应该发生碰撞。它们都没有设置为触发器。
  • @CocoWaff:至少有一个碰撞的游戏对象需要有一个“刚体”。查找Collider.OnCollisionEnter ( ... ) doc的描述部分。

标签: c# unity3d variables tags collision


【解决方案1】:

要检查的一件事是documentation 提到

注意:仅当其中一个碰撞器还附加了非运动学刚体时才会发送碰撞事件。

如果您碰巧在 RigidBody 下的检查器中选中了“Is Kinematic”,那么您将不会收到碰撞事件。

此外,以防万一这是新信息,将调试器附加到您的脚本中,如 here 所示真的很有帮助。例如,您可以在 OnCollisionEnter 函数中设置断点来验证它是否被调用。

【讨论】:

  • 我的游戏对象是动态的,感谢您指出断点工具,事实证明我的 OnCollisionEnter 函数甚至没有被调用。虽然我不明白为什么。关于为什么不能调用它的任何提示?我所有的物体都有碰撞器,并且被击中物体上的碰撞器完美地工作。我可能会稍后删除这个问题,因为我似乎一直在关注问题的错误部分。
  • 另外我建议使用 CompareTag 更有效
  • 您是否有机会分享具有相同设置的项目或小样本?
  • 嘿@Co​​coWaff!也许您可以尝试增加对撞机的大小以检查它是否最终调用 OnCollisionEnter。我在一个项目中遇到了同样的问题,我得到的线索是碰撞发生在 2 帧之间或类似不会触发事件的帧之间。希望对你有帮助!