【问题标题】:Why is my bullet moving through my enemy and not detecting a collision?为什么我的子弹穿过我的敌人而没有检测到碰撞?
【发布时间】:2020-08-12 14:59:33
【问题描述】:

我设置了我的 Unity 2D 项目,因此子弹是触发器,将检测和碰撞但不与环境交互,而我的敌人是对撞机,这样它就可以做到这两点。我不知道它们是两种不同类型的事实是否会影响碰撞,但我想我会包括那个细节以防万一。我知道这个问题不是由于我的子弹移动得太快引起的,因为当我将子弹的速度调低时,问题仍然存在。我将在这里包含敌人碰撞和子弹碰撞检测的代码:

void OnCollisionEnter2D (Collision2D coll)
{
    if (coll.gameObject.tag == "Proj") {
        Destroy(gameObject);
        Debug.Log("Hit");
    }

现在是子弹:

void OnTriggerEnter2D(Collider2D hitInfo)
{
    if (hitInfo.gameObject.tag == "Enemy") {
    Destroy(gameObject);
    }

子弹检测到与敌人的碰撞并自行删除,但敌人未检测到与子弹的碰撞并受到伤害/自行删除。即使我关闭了子弹代码的 Destroy(gameObject) 部分,这样它就不会在碰撞时自行破坏,我仍然遇到同样的问题,所以我知道在检测到任何东西之前删除它并不重要。我希望我的解释足够彻底,并且有人可以帮助我解决这个问题。 检查员图片:https://imgur.com/a/TLfcNcp

【问题讨论】:

  • 我们需要查看inspector才能真正了解每个collider和tags等的设置...
  • 如果速度太高,可以忽略碰撞。如果是这种情况,我可以回答一个解决方案。

标签: c# unity3d collision-detection


【解决方案1】:

子弹必须是非触发碰撞器,因为您正在调用 OnCollisionEnter 而不是来自敌人脚本的 OnTriggerEnter。

【讨论】:

    【解决方案2】:

    请显示每个对撞机的设置,OnCollisionEnter2DOnTriggerEnter2D 是两种不同的东西,并且会在不同的条件下发生,因此请确保您为玩家使用正确的设置。

    【讨论】:

    • 每个使用默认设置的盒子碰撞器,唯一改变的是子弹上我将 IsTrigger 设置为 true。
    • 触发器禁用碰撞输入,希望[this] (answers.unity.com/questions/454479/…) 统一论坛帖子可以回答您的问题。
    【解决方案3】:

    我对触发器行为并不完全熟悉,因为我已经有一段时间没有玩过这些了,但是this bit of documentation for MonoBehaviour.OnTriggerEnter2D(Collider2D) 是解决您的问题的重要起点:

    仅当其中一个 Collider 还附加了 Rigidbody2D 时才会发送触发事件。

    我不能肯定,但你的截图表明没有Rigidbody2D参与。


    有趣的是,

    Collider2D.OnTriggerEnter2D(Collider2D) 的文档忽略了指定 Rigidbody2D 是必需的。我不确定这意味着什么;据说MonoBehaviour.OnTriggerEnter(Collider)Collider.OnTriggerEnter(Collider)(3D 类似物)都需要RigidBody。这两个页面都声称

    如果两个游戏对象都启用了 Collider.isTrigger,则不会发生碰撞。

    但是,Monobehaviour.OnTriggerEnter2D(Collider2D) 的示例代码声称将两个 2D 碰撞器都设置为触发器仍然允许调用该函数。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 2019-12-07
      相关资源
      最近更新 更多