Обнаруживать / обрабатывать все столкновения из одного скрипта или скрипта, не прикрепленного к gameobject столкновения

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

Нравиться

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

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

1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Instead of creating a script for each one, can I create one GameObject and attach a script to control all trigger event?

Чтобы 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. Когда OnTriggerEnter2D вызывается в сценарии CollisionCallback, будет вызываться зарегистрированная функция в 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);
    }
}

Другие вопросы по теме