【问题标题】:Unity: 2D Collision Detection Using TagsUnity:使用标签的 2D 碰撞检测
【发布时间】:2020-04-15 08:41:25
【问题描述】:
void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.tag == "Bullet")
    {
        Destroy(gameObject);
        Debug.Log("hit");
    }
}

这是我的代码,我很欣赏那里有很多其他来源,但是我在互联网上查看过,只是不明白我哪里出错了。我知道它可能是这么小的东西。我正在尝试使用标签进行碰撞检测破坏“这个”游戏对象。 Bullet 预制件具有 Bullet 标签并且拼写完全相同,两个游戏对象都具有刚体和 2D 盒碰撞器。

任何帮助都会很棒。

【问题讨论】:

  • 您可能想要更准确地解释 发生什么 vs 您想要发生什么以及哪些对象使用此代码。
  • 现在我什至不确定这段代码是在子弹还是可破坏的物体上执行的。谁被标记也是如此。
  • 实际上什么也没发生,脚本在一个敌人的 AI 精灵上,我想要它,所以当子弹碰撞当前的游戏对象(敌人的 AI 精灵)时被破坏。除了敌人 AI sprite prefab 的 prefab 之外,没有其他对象使用此代码。不,他们有单独的标签,敌人的 AI 精灵被标记为敌人,子弹被标记为子弹。
  • 尝试打印出这个游戏对象的名称+标签,看看它与什么碰撞
  • 一般来说,宁可使用if(collision.gameObject.CompareTag("Bullet")) 来排除任何拼写错误,因为如果给定的标签名称拼写错误/不存在,它会直接抛出错误,而不是静默失败。 (它也比字符串比较快一点;))另外,两者之一可能是isTrigger

标签: c# unity3d 2d collision


【解决方案1】:

检查事项:

  • Rigibody2D 是模拟的(在检查器 Rigidbody2D 模拟检查为真)
  • 没有一个碰撞器被设置为 isTrigger
  • 因为这是 2d,所以请确保两个 sprite 在相同的层顺序或 z 顺序上
  • 尝试调试并检查子弹击中的对象

(我假设你有 Rigidbody2D 而不是你在问题中提到的 Rogidbody)

(如果所有这些都被选中,那么只是为了测试尝试降低子弹的速度,如果子弹飞得太快,那么尝试将“碰撞检测”更改为继续)

大多数导入的东西“调试” 并在销毁之前而不是之后进行调试

【讨论】:

  • 谢谢!我最终重新启动了项目,并根据您提到的内容检查了新项目,它似乎有效,也许只是那个项目,或者我缺少的东西,谢谢 :)
【解决方案2】:

更好的做法是改用CompareTag

private void OnCollisionEnter(Collision other) {
    if(other.gameObject.CompareTag("Ground")) {
        isJumping = false;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多