【问题标题】:OnTriggerEnter2D Called Twice in UnityOnTriggerEnter2D 在 Unity 中调用了两次
【发布时间】:2019-03-08 11:40:27
【问题描述】:

大家好,我在使用 OnTriggerEnter2D 时遇到问题。

玩家有 2 颗子弹,任何时候玩家的子弹击中敌人都应该将分数增加 100,但由于某种原因,如果两颗玩家的子弹击中敌人,则分数会增加 200。两颗子弹同时开火,位于玩家枪的两侧。所以它应该只将分数增加 100 而不是 200。

这是我的代码:

void OnTriggerEnter2D(Collider2D col)
{
    if(col.tag == "PlayerBullet")
    {
        this.score += 100;
    }
}

其他信息:

我的玩家子弹和敌人都附有 Box Collider 和 RigidBody2D。他们都选中了 isTrigger 选项。

【问题讨论】:

  • 如果每个子弹值 100 并且“如果两个玩家子弹击中敌人,则分数增加 200”这听起来对我有用.. 也许你需要澄清问题?
  • 对不起,不管是一两颗子弹击中敌人,它都应该只增加100分。
  • 只是为了清楚。如果玩家向敌人发射任意数量的子弹,并且为了简单起见,假设它们都击中了,你只想总共击中 1 发?我只是想避免你回来说“好吧,所以玩家射了 2 发子弹,我只想记录 1 次命中,但如果他以后再射同一个敌人,我也想数数”。因为那样我们需要更多的标准。
  • 我不明白你的逻辑。你说有两颗子弹,所以每次一颗子弹击中玩家,它就会增加 100。所以两颗子弹会增加 200。
  • 我只想注册一次碰撞。如果您现在明白我的意思,请告诉我,非常抱歉造成混淆!

标签: c# unity3d collision-detection


【解决方案1】:

如果您希望它只工作一次,您可以在第一次增加分数后(也就是第一次碰撞后)ignore collision,如下所示:

void OnTriggerEnter2D(Collider2D col)
{
   if(col.tag == "PlayerBullet")
   {
      this.score += 100;
      Physics2D.IgnoreCollision(col, GetComponent<Collider2D>())
   }
}

请注意在此之后,PlayerBulletEnemy 之间的所有冲突都将被忽略。

【讨论】:

  • 嘿,这行不通,因为Physics2D.IgnoreCollision(col, GetComponent&lt;Collider2D&gt;()) 应该在 Unity 的 Update() 函数中。
  • @Blaze 谁说它应该在Update 中?我实现了它,它工作得很好。
  • 文档指定它应该在更新中。
  • 它具体在哪里指定:) 我在OnTriggerEnter 中实现了它,它的工作原理我不知道你在说什么。在Update 中使用IgnoreCollision 也是没有意义的。
  • 我的错,它应该在 Start 之类的文档中。另外,也许我做错了,我会重试的,道歉。
【解决方案2】:

如果我理解正确的话,玩家有两支枪,我假设它们是同时开火的。

在这种情况下,我们可以使用条件-条件语句使其更加美观。

我将离开下面的代码块。

    if (Input.GetMouseButtonDown(0) && Input.GetMouseButtonDown(1))
    {
        Debug.Log("Fire Metod(Score)");
    }
    else
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("Fire Metod(Score)");
        }

        if (Input.GetMouseButtonDown(1))
        {
            Debug.Log("Fire Metod(Score)");
        }
    }

【讨论】:

    【解决方案3】:

    通常你可以设置一个标志来告诉游戏只增加一次。标志只是一个布尔值,在类的范围内可以是私有的。有点像:

    if(canHit)
    {
       canHit = false;
       //add score
       canHit = true;
    }
    

    这个基本公式应该可以得到你想要的结果。

    【讨论】:

    • 嘿,谢谢你的回复,我试过了,但没有成功。
    • 这不起作用,因为canHit 最初为真,在执行此块后仍为真,这没有任何意义。在块的末尾应该是 false。
    【解决方案4】:

    我正在将我的评论升级为答案,因为在阅读了您的问题和评论回复后,我相信您需要一个非代码答案。

    您希望两个对象一起工作并在它们与另一个对象碰撞时算作一次“碰撞”。在我看来,这听起来像是一种情况,您应该将这些对象放在另一个对象中,让我们称其为“射击”对象,并且您应该基于此进行碰撞和诸如此类的事情。这样一来,如果两颗子弹都只击中一发“子弹”,那么它将按原样计入代码,听起来它会像您预期的那样实现得更多。

    【讨论】:

      猜你喜欢
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-19
      • 2014-12-14
      • 2016-02-28
      • 2018-10-29
      • 2015-03-12
      相关资源
      最近更新 更多