OnTriggerEnter2D дважды вызывается в Unity - PullRequest
0 голосов
/ 08 марта 2019

Привет, ребята. У меня проблема в единстве с OnTriggerEnter2D.

У игрока есть 2 пули, каждый раз, когда пуля игрока поражает противника, он должен увеличить счет на 100, но по некоторым причинам он увеличивает счет на 200, если две пули игрока попали в противника. Обе пули стреляют одновременно и находятся по обе стороны от оружия игроков. Таким образом, он должен увеличивать счет только на 100, а не на 200.

Вот мой код:

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

Другая информация:

У моего игрока и пули противника есть Box Collider и RigidBody2D. Они оба имеют опцию isTrigger.

Ответы [ 4 ]

2 голосов
/ 08 марта 2019

Если вы хотите, чтобы это работало только один раз, вы можете игнорировать столкновение после первого приращения счета (то есть после первого столкновения), например:

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

Обратите внимание, что После этой точки все столкновения между PlayerBullet и Enemy будут игнорироваться.

0 голосов
/ 08 марта 2019

Я обновляю свой комментарий до ответа, потому что после прочтения вашего вопроса и ответов на комментарии я считаю, что вам нужен ответ без кода.

Вы хотите, чтобы два объекта работали вместе и считались одним «попаданием», когда они сталкиваются с другим объектом. Это звучит для меня как ситуация, когда вы должны поместить эти объекты внутрь другого, давайте назовем его «выстрелом», и вы должны делать столкновения и все такое на этом основании. Таким образом, если обе пули попали только в один «выстрел», значит, он будет считаться с кодом как есть, и звучит так, как будто он будет реализован больше, чем вы ожидали.

0 голосов
/ 08 марта 2019

Часто вы можете установить флаг , чтобы сообщить игре об увеличении только один раз. Флаг - это просто логическое значение, и он может быть закрытым в пределах класса. Вроде как:

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

Эта базовая формула должна дать вам желаемые результаты.

0 голосов
/ 08 марта 2019

Если я правильно понимаю, у игрока есть два пистолета, и я предполагаю, что они стреляют одновременно.

В этом случае мы можем сделать его более красивым с помощью операторов условия-условия.

Я оставляю блок кода ниже.

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