C# OnTiggerEnter2D在Unity中调用了两次

C# OnTiggerEnter2D在Unity中调用了两次,c#,unity3d,collision-detection,C#,Unity3d,Collision Detection,嗨,伙计们,我在与OnTiggerInter2D的联合中遇到了一个问题 玩家有2颗子弹,任何时候玩家子弹击中敌人都会增加100分,但由于某种原因,如果两颗玩家子弹击中敌人,则会增加200分。两颗子弹同时发射,都在枪的两侧。所以它应该只增加100分,而不是200分 这是我的密码: void OnTriggerEnter2D(Collider2D col) { if(col.tag == "PlayerBullet") { this.score += 100;

嗨,伙计们,我在与OnTiggerInter2D的联合中遇到了一个问题

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

这是我的密码:

void OnTriggerEnter2D(Collider2D col)
{
    if(col.tag == "PlayerBullet")
    {
        this.score += 100;
    }
}
其他资料:


我的玩家bullet和敌人都有盒式对撞机和RigidBody2D。它们都选中了isTrigger选项。

如果您想让它只工作一次,您可以在分数第一次增加后(即第一次碰撞后)这样做:

void OnTriggerEnter2D(Collider2D col)
{
   if(col.tag == "PlayerBullet")
   {
      this.score += 100;
      Physics2D.IgnoreCollision(col, GetComponent<Collider2D>())
   }
}
void OnTriggerEnter2D(碰撞的R2D列)
{
如果(列标记==“PlayerBullet”)
{
这个分数+=100;
Physics2D.IgnoreCollision(col,GetComponent())
}
}

注意在这一点之后,
PlayerBullet
敌人之间的所有碰撞都将被忽略。

如果你想让它只工作一次,你可以在第一次增加分数后(即第一次碰撞后)这样做:

void OnTriggerEnter2D(Collider2D col)
{
   if(col.tag == "PlayerBullet")
   {
      this.score += 100;
      Physics2D.IgnoreCollision(col, GetComponent<Collider2D>())
   }
}
void OnTriggerEnter2D(碰撞的R2D列)
{
如果(列标记==“PlayerBullet”)
{
这个分数+=100;
Physics2D.IgnoreCollision(col,GetComponent())
}
}

注意在这一点之后,
PlayerBullet
敌人
之间的所有碰撞都将被忽略。

如果我理解正确,玩家有两把枪,我假设它们同时开火

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

我留下下面的代码块

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

如果我理解正确的话,玩家有两把枪,我假设他们同时开火

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

我留下下面的代码块

    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)");
        }
    }
通常情况下,你可以设置一个标志,告诉游戏只增加一次。标志只是一个布尔值,在类的范围内可以是私有的。有点像:

if(canHit)
{
   canHit = false;
   //add score
   canHit = true;
}
这个基本公式应该可以得到你想要的结果。

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

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

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

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


您希望两个对象一起工作,并在与另一个对象碰撞时计算为一次“碰撞”。对我来说,这听起来像是一种情况,你应该把这些物体放在另一个物体里面,我们称之为“射击”物体,你应该在这个基础上进行碰撞等等。这样,如果两个项目都只命中一个“shot”命中,那么代码将按原样计算,而且听起来它将按照您的预期实现更多。

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


您希望两个对象一起工作,并在与另一个对象碰撞时计算为一次“碰撞”。对我来说,这听起来像是一种情况,你应该把这些物体放在另一个物体里面,我们称之为“射击”物体,你应该在这个基础上进行碰撞等等。这样,如果两颗子弹只命中一个“射击”命中,那么代码将按原样计算,并且听起来它将按照您的预期实现更多。

如果每颗子弹值100,并且“如果两颗玩家子弹击中敌人,则分数将增加200”,这听起来对我很有效。。也许你需要澄清这个问题?对不起,不管一颗或两颗子弹碰到敌人,它只会增加100分。只是为了澄清一下。如果玩家向敌人射出任意数量的子弹,为了简单起见,假设它们都命中,你只想总共命中1次?我只是想避免你回来说这样的话:“好吧,玩家射出2发子弹,我只想射中1发,但如果他以后再次射中同一个敌人,我也要数一数。”。因为我们需要更多的标准,我不明白你的逻辑。你说过有两颗子弹,所以每次一颗子弹击中玩家,它就会增加100。所以两颗子弹是200,我只想记录一次碰撞。请让我知道,如果你现在明白我的意思,非常抱歉的混乱!如果每颗子弹值100,并且“如果两颗玩家子弹击中敌人,则得分将增加200”,我觉得这似乎很有效。。也许你需要澄清这个问题?对不起,不管一颗或两颗子弹碰到敌人,它只会增加100分。只是为了澄清一下。如果玩家向敌人射出任意数量的子弹,为了简单起见,假设它们都命中,你只想总共命中1次?我只是想避免你回来说这样的话:“好吧,玩家射出2发子弹,我只想射中1发,但如果他以后再次射中同一个敌人,我也要数一数。”。因为我们需要更多的标准,我不明白你的逻辑。你说过有两颗子弹,所以每次一颗子弹击中玩家,它就会增加100。所以两颗子弹是200,我只想记录一次碰撞。请让我知道,如果你现在明白我的意思,非常抱歉的混乱!嘿,谢谢你的回答,我试过了,但运气不好。这不起作用,因为
canHit
最初是真的,执行此块后仍然是真的,这毫无意义。在块的末尾应该是false。嘿,谢谢你的回答,我尝试了这个,但没有成功。这不起作用,因为
canHit
最初是真的,执行后仍然是真的