-
Los Events (eventos) son unos delegates especializados
-
que son útiles para cuando usted quiere alertar
-
a otras clases que algo sucedió.
-
En práctica usted verá que los eventos
-
funcionan muy similar a los public multicast delegates.
-
Para más información acerca de delegates
-
ver la lección de delegates en el enlace abajo.
-
Un evento se puede pensar como un sistema de broadcast (difusión).
-
Cualquier clase que esté interesada en un evento
-
puede subscribir métodos a este.
-
Cuando esa situación específica ocurra,
-
como un click de un botón, o un power-up o una herida al jugador
-
nosotros invocamos nuestro evento y este de vuelta
-
llama los métodos de las clases suscritas.
-
Aquí nosotros tenemos una escena con 2 orbs.
-
Un orb tiene un script llamado TeleportScript
-
mientras que el otro tiene un script llamado TurnColorScript.
-
Adjuntado a nuestra cámara está el EventManagerScript.
-
Un evento se puede hacer para cualquier situación.
-
Pero en este ejemplo nosotros queremos invocar un evento
-
cuando el jugador haga click en un botón
-
que estamos dibujando a la pantalla.
-
En nuestro administrador de eventos (event manager) nosotros podemos ver
-
que hemos creado un tipo de delegate
-
que llamaremos ClickAction.
-
Podemos ver que cualquier método que desea estar subscrito
-
no debe tomar parámetros ni tener un tipo de retorno de void.
-
Luego nosotros creamos nuestra variable de evento.
-
Nosotros hacemos esto con la palabra clave Event.
-
Tenga en cuenta que esta variable también es estática
-
por la que podemos utilizar afuera de la clase
-
sin instanciar un objeto de esta clase.
-
Nuestra variable evento, que llamamos OnClicked
-
es el tipo de delegate que hemos creado arriba.
-
La única cosa es que la clase es responsable de
-
llamar el evento cuando la situación
-
apropiada suceda.
-
Como hemos mencionado antes,
-
nosotros llamaremos esto incluso cuando el jugador
-
haga click en un botón.
-
Por lo tanto, este script tiene un método OnGUI
-
Dentro del método OnGUI
-
nosotros hemos creado un botón en nuestra pantalla.
-
Cuando el jugador le hace click al botón
-
nosotros utilizamos una variable de evento como si fuera una función.
-
Esto en efecto invoca nuestro evento.
-
Por favor tenga en cuenta que como cualquier otro delegate
-
este causa un error si invocamos un evento
-
sin que tenga suscriptores.
-
Por lo tanto, siempre tenemos que asegurarnos
-
que el evento no sea igual a null
-
antes de invocarlo.
-
Si usted se acuerda de los 2 orbs en nuestra
-
escena, estos tienen 2 scripts diferentes adjuntos.
-
Estos 2 scripts van a funcionar como suscriptores
-
a este evento.
-
Miremos esto ahora.
-
En el TeleportScript nosotros hemos
-
creado un método llamado Teleport.
-
Este es el método al cual estaremos subscribiendo
-
al evento que hemos creado en el administrador de eventos (event manager).
-
Usted se dará cuenta que el método Teleport toma ningún parámetro
-
y tiene un tipo de retorno void,
-
como nuestro delegate.
-
El método Teleport es responsable del
-
posicionamiento del objeto de manera aleatoria a lo largo del eje Y.
-
Cerca de la parte superior de nuestro script
-
nosotros tenemos un método llamado OnEnable.
-
Este es un método integrado que será llamado
-
cuando el objeto que tiene este script
-
adjuntado es creado o habilitado en una escena.
-
Nosotros utilizaremos este método para subscribir nuestro
-
método Telport al evento OnClicked
-
del EventScript.
-
Podemos ver que subscribimos un método
-
a un evento utilizando el operador +=.
-
Al subscribir un método a un evento
-
nos estamos asegurando que cuando ese evento ocurra
-
nuestro método será llamado.
-
Luego nosotros tenemos un método OnDisable.
-
Opuesto al método OnEnable,
-
el método OnDisable es llamado cuando
-
un objeto es desactivado o destruido en una escena.
-
Dentro del método OnDisabled
-
nosotros estamos anulando la suscripción de nuestro método al evento.
-
Nosotros subscribimos un método de un evento
-
utilizando el operador -=.
-
Esto nos va asegurar que nuestro método no se
-
llame más cuando un evento ocurra.
-
Este paso es bastante importante
-
y el fallo de hacer esto puede llevar a pérdidas
-
de memoria y errores en nuestro juego.
-
Una buena regla es que cuando usted suscriba
-
un método a un evento usted debe
-
también cancelar una suscripción correspondientes.
-
Nuestro TurnColorScript
-
está estructurado muy similar a nuestro TeleportScript.
-
En este caso nosotros tenemos un método llamado TurnColor
-
que no toma parámetros y tiene un tipo
-
de retorno void.
-
El método TurnColor
-
vuelve el material del objeto en un color aleatorio.
-
Nuevamente, nosotros tenemos los métodos OnEnable
-
y OnDisable.
-
Esta vez, estos están suscribiendo
-
y anulando la suscripción de nuestro método TurnColor
-
del evento.
-
Vale la pena tener en cuenta en otro momento
-
que anulando la suscripción de nuestro método de un evento
-
es fundamental para utilizar eventos adecuadamente
-
y prevenir errores en nuestro código.
-
De vuelta en Unity nosotros podemos correr nuestra escena.
-
La primera cosa para tener en cuenta es el botón
-
que aparece cerca de la parte superior.
-
Cuando se haga click a este botón, se a invocará nuestro evento
-
y llamará los métodos Teleport y TurnColor.
-
Nosotros podemos hacer click en el botón múltiples veces
-
y cada vez los métodos suscriptores serán llamados.
-
Como podemos ver, nuestro administrador de eventos (event manager)
-
solamente necesita preocuparse acerca del evento en sí
-
y los factores desencadenantes al evento.
-
No necesitaba saber acerca del TeleportScript,
-
o el TurnColorScript.
-
Del mismo modo, el TeleportScript y TurnColorScript
-
no necesitaba saber acerca del otro.
-
De esta manera nosotros somos capaces de crear
-
un sistema de broadcast (difusión) muy robusto y flexible.
-
Usted se podría estar preguntando por qué utilizamos una variable
-
estática de evento en vez de una variable pública delegate
-
en nuestro administrador de eventos (event manager)?
-
La verdad es que usted puede lograr la misma
-
funcionalidad de eventos con variables públicas de delegates.
-
De hecho, como hemos mencionado al principio de esta lección,
-
los eventos son simplemente delegates especializados.
-
La razón por la cual nosotros utilizamos eventos sobre
-
variables públicas delegate para situaciones como esta
-
es que los eventos tienen una seguridad inherente
-
dónde las variables delegate no tienen.
-
Con eventos las otras clases
-
solamente se pueden suscribir y des-suscribir.
-
Si nosotros fuéramos a utilizar una variable pública delegate más bien
-
otras clases podrían invocar o
-
anular nuestra variable delegate para hacer
-
todo tipo de cosas nefastas.
-
En términos generales, si usted quiere crear un sistema de
-
métodos dinámicos que involucra más de 1 clase,
-
utilice variables de tipo evento más bien de variables delegate.