Обнаружение / обработка всех коллизий из одного скрипта или скрипта, не привязанного к коллизии GameObject - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу контролировать триггеры между игроком и бонусы. Вместо того, чтобы создавать скрипт для каждого из них, могу ли я создать один GameObject и прикрепить скрипт для управления всеми событиями триггера?

Как

void OnTriggerEnter2D(Collider2D collision){
    switch(collision.gameObject.tag){
        case "Move+":
            FindObjectOfType<CreatePlayer>().movesRemain += 5;
            break;
    }
}

но при этом игрок должен запустить GameObject, который содержит скрипт.

1 Ответ

0 голосов
/ 13 сентября 2018

Вместо создания сценария для каждого, могу ли я создать один GameObject и прикрепить сценарий для управления всем событием триггера?

Для вызова OnTriggerEnter2D сценария, которыйсодержит, он должен быть присоединен к тому GameObject, который будет вовлечен в столкновение.Если этого не сделать, он не будет вызван.


Если вам нужен общий сценарий для обработки всех обнаружений столкновений, вам придется использовать событие и делегировать для этого.Создайте delegate с именем CollisionAction, а затем событие из этого delegate с именем OnTriggered.Когда вызывается OnTriggerEnter2D, вызывается это событие OnTriggered. Прикрепите его ко всем объектам GameObject, на которых вы хотите обнаружить столкновение.

public class CollisionCallback : MonoBehaviour
{
    public delegate void CollisionAction(Collider2D collision);
    public static event CollisionAction OnTriggered;

    void OnTriggerEnter2D(Collider2D collision)
    {
        if (OnTriggered != null)
            OnTriggered(collision);
    }
}

Теперь, в основном сценарии, который вы хотите использовать для обработки столкновения, зарегистрируйтесь на OnTriggeredсобытие в функции OnEnable и отмените его регистрацию в функции OnDisable. Когда в скрипте CollisionCallback вызывается OnTriggerEnter2D, зарегистрированная функция в MainScript будет называться .Присоединить к пустому GameObject:

public class MainScript : MonoBehaviour
{
    void OnEnable()
    {
        //Register to OnTriggered event
        CollisionCallback.OnTriggered += TriggerDetected;
    }


    void OnDisable()
    {
        //Un-Register to OnTriggered event
        CollisionCallback.OnTriggered -= TriggerDetected;
    }


    //This is invoked when trigger happens
    void TriggerDetected(Collider2D collision)
    {
        Debug.Log("Trigger happened with: " + collision.name);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...