在Unity中两次调用OnTriggerEnter2D

时间:2019-03-08 11:40:27

标签: c# unity3d collision-detection

大家好,我在与OnTriggerEnter2D集成时遇到问题。

玩家有2条子弹,每当玩家的子弹击中敌人时,其分数便会增加100,但由于某些原因,如果有两名玩家的子弹击中敌人,分数将增加200。两颗子弹同时发射,并位于玩家枪支的两侧。因此,它只能将分数提高100,而不是200。

这是我的代码:

<td>

其他信息:

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

如果我理解正确,则玩家有两把枪,我认为它们是同时发射的。

在这种情况下,我们可以使用condition-condition语句使它更漂亮。

我要离开下面的代码块。

    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)");
        }
    }

答案 2 :(得分:0)

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

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

该基本公式应该可以为您带来所需的结果。

答案 3 :(得分:0)

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

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