Antes de saltar a lo que es un evento del sistema y cómo hacerlo, primero vamos a discutir por qué es útil tener un sistema de eventos?
En Unity, confiarás en una de las dos cosas enumeradas a continuación para obtener los datos o dependencias de otra clase.
Puede agrupar sus propiedades públicas o serializadas en un Comportamiento único para poder asignarlas desde el inspector para obtener las referencias.
O
Utilizar el patrón Singleton en su código para obtener los datos que necesita.
Si aún no conoce el patrón de diseño de Singletons, es un patrón de diseño de software que restringe la creación de instancias de una clase a una sola instancia. Esto es útil cuando se necesita exactamente un objeto para coordinar acciones en todo el sistema.
Si otro objeto en el código necesita datos de ese objeto, llamamos a la instancia singleton para referirse a él. Los singletons son muy útiles para referirse a las clases que sabes que solo necesitarán una instancia de ellas.
Independientemente del enfoque que utilice para obtener las dependencias, se enfrentará a problemas al ajustar una pequeña cosa o refactorizar el código, especialmente si trabaja en un proyecto muy grande.
¡Aliviemos las dependencias!
Los sistemas de eventos ayudan a modular el código enviando mensajes entre clases que no se conocen directamente entre sí. Permiten que las cosas respondan a un cambio en un estado sin monitorearlo constantemente en un bucle de actualización. Es una forma de patrón de Observador en la que un objeto, llamado sujeto, mantiene una lista de sus dependientes, llamados observadores, y les notifica automáticamente de cualquier cambio de estado, generalmente llamando a sus métodos.
Entendamos esto por un ejemplo de suscripción a una revista.
- Un editor de revistas (sujeto) está en el negocio y publica revistas (datos).
- Si usted(usuario de datos/observador) está interesado en la revista a la que se suscribe (registrarse), y si se publica una nueva edición, se le entrega.
- Si cancela la suscripción (anula el registro), deja de recibir nuevas ediciones.
- El editor no sabe quién eres y cómo usas la revista, solo te la entrega porque eres un suscriptor (acoplamiento suelto).
Cómo diseñar el Sistema de Eventos?
tengo una escena en la que tenemos una ThirdPersonController jugador(decir el Señor X), un laberinto, y algunas puertas. Ahora, digamos que el Sr. X quiere llegar a la salida del laberinto, pero hay algunas puertas en el medio que se pueden abrir tan pronto como el Sr. X se acerque a ellas.
Las puertas tienen disparador cuadro de hadrones que desencadena el resto de hadrones involucrados en este choque.
Implementemos esto usando un sistema de eventos.
Comencemos por agregar un objeto de juego en la escena y agregar un nuevo script llamado EventsManager.cs
Nuestros primeros eventos serán los que se dispararán cuando nuestro jugador entre o salga del área de disparo de la puerta.
Para eso, En EventsManager.clase cs, crear dos acciones de evento DoorTriggerEnter y DoorTriggerExit, también, métodos que pueden invocar la acción de evento respectiva. Además, cree una referencia estática de un solo elemento para la clase.
Ahora, necesitamos objetos que pueden fuego y suscribirse a estos eventos. Para ello, cree dos clases, una para door, DoorController.cs, y uno para el área del gatillo de la puerta, DoorTrigger.cs.
En el controlador de puerta.cs, cree dos métodos que puedan escuchar cuando alguien dispara eventos DoorTriggerEnter o DoorTriggerExit y realiza sus tareas. En el método Start del controlador de puerta, acceda a los eventos de la clase EventsManager utilizando la instancia estática y suscríbase a su método respectivo.
Ahora, nuestros eventos son listos y los suscriptores están escuchando a estos eventos. Por lo tanto, en la clase DoorTrigger, solo necesitamos disparar esos eventos en el método OnTtriggerenter.
Bien.. así que vamos a conectar el controlador de puerta y el guion de DoorTrigger a cada puerta y área de disparo respectivamente y reproducir la escena.
Uhh Ohh! Hay un problema…
Nuestro EventManager es una clase singleton y cada puerta gatillo es la invocación del evento y cada controlador de puertas es escuchar y responder a ese mismo evento. Necesitamos pasar algún id único al invocar el evento para que solo la puerta que tiene el mismo id escuche ese evento.
En nuestro caso particular, los disparadores y el objeto padre de la puerta son los mismos. Por lo tanto, podemos pasar el id de instancia del objeto de juego del padre.
Vamos a jugar a la escena..
Yeahhh.. está funcionando como se esperaba ahora.
Asegúrese de cancelar la suscripción a estos eventos, ya que pueden provocarle algunos errores no deseados. Por ejemplo, si destruye su puerta en tiempo de ejecución, etc.
Así que, así es como podemos hacer nuestro sistema de eventos simple.
Eso es todo por ahora amigos… ¡Feliz Programación! 🙂