OnTriggerEnter2D在Unity中调用了两次

问题描述 投票:0回答:4

嗨,大家好我和OnTriggerEnter2D有问题。

玩家有2颗子弹,每当玩家子弹击中敌人时,它应该将分数增加100,但由于某种原因,如果两个玩家子弹击中敌人,则将分数增加200。两颗子弹同时射击并且位于球员枪的两侧。所以它应该只将分数增加100而不是200。

这是我的代码:

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

其他信息:

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

c# unity3d collision-detection
4个回答
2
投票

如果你希望它能够在第一次增加分数(也就是第一次碰撞后)之后才能使用ignore collision,就像这样:

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

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


0
投票

如果我理解正确,玩家有两把枪,我认为他们同时被解雇了。

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

我将离开下面的代码块。

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

0
投票

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

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

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


0
投票

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

您希望两个对象一起工作,并在与另一个对象发生碰撞时计为一个“命中”。这听起来像是一种情况,你应该将这些对象放在另一个对象中,让我们把它称为“镜头”对象,你应该根据它进行碰撞等等。这样,如果两个子弹只击中一个“击中”命中,那么它将按原样计算,并且听起来它会像你预期的那样实现更多。

© www.soinside.com 2019 - 2024. All rights reserved.