Несколько триггеров в Unity

Эталонное изображение

У меня есть определенный объект в моей игре, и я пытаюсь увидеть, вызывает ли этот объект несколько триггеров. Я пробовал с кодом ниже, но по какой-то причине он не работает.

void OnTriggerEnter2D(Collider2D col)
{
    if (col.tag == "speed")
    {
        //do something
    }
    else if (col.tag == "speed" && col.tag == "point")
    {
        //do something
    }
}

Как я могу узнать, попал ли объект только в «Col1» или «Col1» и «Col2»


person John    schedule 13.07.2017    source источник


Ответы (2)


OnTriggerEnter вызывается только тогда, когда ваш объект сталкивается с одним определенным триггером. Таким образом, тег коллайдера (col) не может быть одновременно speed и point.

Вы должны отслеживать, сталкивается ли объект с вашими триггерами, используя логическую переменную, например:

private bool collidingWithSpeed;
private bool collidingWithPoint;

void OnTriggerEnter2D(Collider2D col)
{
    if (col.CompareTag("speed"))
    {
        collidingWithSpeed = true ;
        //do something
    }
    else if (col.CompareTag("point"))
    {
        collidingWithPoint = true ;
        //do something
    }

    if( collidingWithSpeed && collidingWithPoint )
    {
         // Do something when your object collided with both triggers
    }
}
// Don't forget to set the variables to false when your object exits the triggers!
void OnTriggerExit2D(Collider2D col)
{
    if (col.CompareTag("speed"))
    {
        collidingWithSpeed = false;
    }
    else if (col.CompareTag("point"))
    {
        collidingWithPoint = false;
    }
}
person Hellium    schedule 13.07.2017

Хотя ответ @Hellium будет работать отлично, я лично предпочитаю использовать список для хранения всех моих сталкивающихся объектов (или, по крайней мере, некоторых из них). Вот так

private readonly List<string> collidingTags = new List<string>();

void OnTriggerEnter2D(Collider2D collider)
{
    //Add some kind of filter or safety check if needed
    collidingTags.Add(collider.tag);
}

void OnTriggerExit2D(Collider2D collider)
{
    //Add some kind of safety check if needed
    collidingTags.Remove(collider.tag);
}

Теоретически это гораздо менее эффективно с точки зрения производительности (по сравнению с хранением логического значения), но, тем не менее, это добавляет хороший уровень гибкости. На практике разница в производительности невероятно мала, так что решать вам!

person MadStark    schedule 13.07.2017
comment
Спасибо за ответ :) - person John; 13.07.2017