0:00:00.269,0:00:01.888 Los Events (eventos) son unos delegates especializados 0:00:01.888,0:00:03.723 que son útiles para cuando usted quiere alertar 0:00:03.723,0:00:05.723 a otras clases que algo sucedió. 0:00:06.454,0:00:08.454 En práctica usted verá que los eventos 0:00:08.454,0:00:12.087 funcionan muy similar a los public multicast delegates. 0:00:12.856,0:00:14.625 Para más información acerca de delegates 0:00:14.625,0:00:17.069 ver la lección de delegates en el enlace abajo. 0:00:18.740,0:00:21.713 Un evento se puede pensar como un sistema de broadcast (difusión). 0:00:21.713,0:00:23.713 Cualquier clase que esté interesada en un evento 0:00:23.713,0:00:25.713 puede subscribir métodos a este. 0:00:26.550,0:00:28.914 Cuando esa situación específica ocurra, 0:00:28.914,0:00:32.458 como un click de un botón, o un power-up o una herida al jugador 0:00:32.458,0:00:34.458 nosotros invocamos nuestro evento y este de vuelta 0:00:34.458,0:00:37.110 llama los métodos de las clases suscritas. 0:00:38.495,0:00:40.495 Aquí nosotros tenemos una escena con 2 orbs. 0:00:40.937,0:00:43.754 Un orb tiene un script llamado TeleportScript 0:00:43.754,0:00:46.690 mientras que el otro tiene un script llamado TurnColorScript. 0:00:47.315,0:00:50.512 Adjuntado a nuestra cámara está el EventManagerScript. 0:00:51.368,0:00:54.466 Un evento se puede hacer para cualquier situación. 0:00:54.466,0:00:57.175 Pero en este ejemplo nosotros queremos invocar un evento 0:00:57.175,0:00:58.877 cuando el jugador haga click en un botón 0:00:58.877,0:01:00.877 que estamos dibujando a la pantalla. 0:01:01.964,0:01:03.964 En nuestro administrador de eventos (event manager) nosotros podemos ver 0:01:03.964,0:01:06.089 que hemos creado un tipo de delegate 0:01:06.089,0:01:08.089 que llamaremos ClickAction. 0:01:09.031,0:01:12.418 Podemos ver que cualquier método que desea estar subscrito 0:01:12.418,0:01:16.181 no debe tomar parámetros ni tener un tipo de retorno de void. 0:01:16.945,0:01:20.221 Luego nosotros creamos nuestra variable de evento. 0:01:20.221,0:01:23.261 Nosotros hacemos esto con la palabra clave Event. 0:01:23.803,0:01:26.235 Tenga en cuenta que esta variable también es estática 0:01:26.235,0:01:28.235 por la que podemos utilizar afuera de la clase 0:01:28.235,0:01:31.290 sin instanciar un objeto de esta clase. 0:01:32.623,0:01:36.297 Nuestra variable evento, que llamamos OnClicked 0:01:36.297,0:01:39.248 es el tipo de delegate que hemos creado arriba. 0:01:40.012,0:01:42.896 La única cosa es que la clase es responsable de 0:01:42.896,0:01:44.896 llamar el evento cuando la situación 0:01:44.896,0:01:46.616 apropiada suceda. 0:01:47.257,0:01:48.949 Como hemos mencionado antes, 0:01:48.949,0:01:50.949 nosotros llamaremos esto incluso cuando el jugador 0:01:50.949,0:01:52.298 haga click en un botón. 0:01:52.298,0:01:55.521 Por lo tanto, este script tiene un método OnGUI 0:01:56.729,0:01:58.631 Dentro del método OnGUI 0:01:58.631,0:02:00.631 nosotros hemos creado un botón en nuestra pantalla. 0:02:01.089,0:02:03.089 Cuando el jugador le hace click al botón 0:02:03.089,0:02:06.035 nosotros utilizamos una variable de evento como si fuera una función. 0:02:06.535,0:02:09.328 Esto en efecto invoca nuestro evento. 0:02:10.550,0:02:12.886 Por favor tenga en cuenta que como cualquier otro delegate 0:02:12.886,0:02:14.886 este causa un error si invocamos un evento 0:02:14.886,0:02:16.886 sin que tenga suscriptores. 0:02:16.886,0:02:18.886 Por lo tanto, siempre tenemos que asegurarnos 0:02:18.886,0:02:20.886 que el evento no sea igual a null 0:02:20.886,0:02:22.886 antes de invocarlo. 0:02:23.789,0:02:26.137 Si usted se acuerda de los 2 orbs en nuestra 0:02:26.137,0:02:29.393 escena, estos tienen 2 scripts diferentes adjuntos. 0:02:29.393,0:02:31.393 Estos 2 scripts van a funcionar como suscriptores 0:02:31.393,0:02:33.184 a este evento. 0:02:33.184,0:02:35.184 Miremos esto ahora. 0:02:36.503,0:02:38.503 En el TeleportScript nosotros hemos 0:02:38.503,0:02:40.503 creado un método llamado Teleport. 0:02:41.114,0:02:43.114 Este es el método al cual estaremos subscribiendo 0:02:43.114,0:02:46.023 al evento que hemos creado en el administrador de eventos (event manager). 0:02:46.815,0:02:50.097 Usted se dará cuenta que el método Teleport toma ningún parámetro 0:02:50.097,0:02:51.875 y tiene un tipo de retorno void, 0:02:51.875,0:02:53.583 como nuestro delegate. 0:02:54.292,0:02:56.292 El método Teleport es responsable del 0:02:56.292,0:02:59.492 posicionamiento del objeto de manera aleatoria a lo largo del eje Y. 0:03:00.284,0:03:01.980 Cerca de la parte superior de nuestro script 0:03:01.980,0:03:04.601 nosotros tenemos un método llamado OnEnable. 0:03:04.601,0:03:06.601 Este es un método integrado que será llamado 0:03:06.601,0:03:08.601 cuando el objeto que tiene este script 0:03:08.601,0:03:12.296 adjuntado es creado o habilitado en una escena. 0:03:13.185,0:03:15.352 Nosotros utilizaremos este método para subscribir nuestro 0:03:15.352,0:03:18.429 método Telport al evento OnClicked 0:03:18.429,0:03:20.624 del EventScript. 0:03:20.624,0:03:22.624 Podemos ver que subscribimos un método 0:03:22.624,0:03:25.467 a un evento utilizando el operador +=. 0:03:26.425,0:03:28.704 Al subscribir un método a un evento 0:03:28.704,0:03:30.997 nos estamos asegurando que cuando ese evento ocurra 0:03:30.997,0:03:32.997 nuestro método será llamado. 0:03:33.900,0:03:37.622 Luego nosotros tenemos un método OnDisable. 0:03:37.622,0:03:39.622 Opuesto al método OnEnable, 0:03:39.622,0:03:41.622 el método OnDisable es llamado cuando 0:03:41.622,0:03:45.006 un objeto es desactivado o destruido en una escena. 0:03:45.775,0:03:47.955 Dentro del método OnDisabled 0:03:47.955,0:03:50.749 nosotros estamos anulando la suscripción de nuestro método al evento. 0:03:51.330,0:03:53.219 Nosotros subscribimos un método de un evento 0:03:53.219,0:03:55.689 utilizando el operador -=. 0:03:56.511,0:03:58.511 Esto nos va asegurar que nuestro método no se 0:03:58.511,0:04:01.037 llame más cuando un evento ocurra. 0:04:02.233,0:04:04.233 Este paso es bastante importante 0:04:04.233,0:04:06.233 y el fallo de hacer esto puede llevar a pérdidas 0:04:06.233,0:04:08.233 de memoria y errores en nuestro juego. 0:04:08.844,0:04:10.844 Una buena regla es que cuando usted suscriba 0:04:10.844,0:04:12.844 un método a un evento usted debe 0:04:12.844,0:04:15.531 también cancelar una suscripción correspondientes. 0:04:17.017,0:04:19.017 Nuestro TurnColorScript 0:04:19.017,0:04:22.219 está estructurado muy similar a nuestro TeleportScript. 0:04:22.816,0:04:26.081 En este caso nosotros tenemos un método llamado TurnColor 0:04:26.081,0:04:28.081 que no toma parámetros y tiene un tipo 0:04:28.081,0:04:29.619 de retorno void. 0:04:30.414,0:04:32.069 El método TurnColor 0:04:32.069,0:04:34.959 vuelve el material del objeto en un color aleatorio. 0:04:35.515,0:04:38.182 Nuevamente, nosotros tenemos los métodos OnEnable 0:04:38.182,0:04:40.182 y OnDisable. 0:04:40.793,0:04:42.793 Esta vez, estos están suscribiendo 0:04:42.793,0:04:45.334 y anulando la suscripción de nuestro método TurnColor 0:04:45.334,0:04:46.862 del evento. 0:04:47.584,0:04:49.584 Vale la pena tener en cuenta en otro momento 0:04:49.584,0:04:51.584 que anulando la suscripción de nuestro método de un evento 0:04:51.584,0:04:54.232 es fundamental para utilizar eventos adecuadamente 0:04:54.232,0:04:56.232 y prevenir errores en nuestro código. 0:04:57.454,0:05:00.092 De vuelta en Unity nosotros podemos correr nuestra escena. 0:05:00.092,0:05:02.092 La primera cosa para tener en cuenta es el botón 0:05:02.092,0:05:03.799 que aparece cerca de la parte superior. 0:05:03.799,0:05:05.799 Cuando se haga click a este botón, se a invocará nuestro evento 0:05:05.799,0:05:09.120 y llamará los métodos Teleport y TurnColor. 0:05:09.120,0:05:11.120 Nosotros podemos hacer click en el botón múltiples veces 0:05:11.120,0:05:14.600 y cada vez los métodos suscriptores serán llamados. 0:05:15.836,0:05:17.836 Como podemos ver, nuestro administrador de eventos (event manager) 0:05:17.836,0:05:20.338 solamente necesita preocuparse acerca del evento en sí 0:05:20.338,0:05:22.577 y los factores desencadenantes al evento. 0:05:22.577,0:05:24.926 No necesitaba saber acerca del TeleportScript, 0:05:24.926,0:05:26.636 o el TurnColorScript. 0:05:27.259,0:05:31.055 Del mismo modo, el TeleportScript y TurnColorScript 0:05:31.055,0:05:33.055 no necesitaba saber acerca del otro. 0:05:33.916,0:05:35.916 De esta manera nosotros somos capaces de crear 0:05:35.916,0:05:38.909 un sistema de broadcast (difusión) muy robusto y flexible. 0:05:40.346,0:05:42.346 Usted se podría estar preguntando por qué utilizamos una variable 0:05:42.346,0:05:45.089 estática de evento en vez de una variable pública delegate 0:05:45.089,0:05:46.669 en nuestro administrador de eventos (event manager)? 0:05:47.353,0:05:50.205 La verdad es que usted puede lograr la misma 0:05:50.205,0:05:53.297 funcionalidad de eventos con variables públicas de delegates. 0:05:53.797,0:05:56.894 De hecho, como hemos mencionado al principio de esta lección, 0:05:56.894,0:05:59.879 los eventos son simplemente delegates especializados. 0:05:59.879,0:06:01.879 La razón por la cual nosotros utilizamos eventos sobre 0:06:01.879,0:06:04.849 variables públicas delegate para situaciones como esta 0:06:04.849,0:06:06.849 es que los eventos tienen una seguridad inherente 0:06:06.849,0:06:08.849 dónde las variables delegate no tienen. 0:06:09.433,0:06:11.433 Con eventos las otras clases 0:06:11.433,0:06:13.698 solamente se pueden suscribir y des-suscribir. 0:06:14.350,0:06:17.584 Si nosotros fuéramos a utilizar una variable pública delegate más bien 0:06:17.584,0:06:19.584 otras clases podrían invocar o 0:06:19.584,0:06:21.584 anular nuestra variable delegate para hacer 0:06:21.584,0:06:23.584 todo tipo de cosas nefastas. 0:06:24.431,0:06:27.348 En términos generales, si usted quiere crear un sistema de 0:06:27.348,0:06:30.579 métodos dinámicos que involucra más de 1 clase, 0:06:30.579,0:06:33.632 utilice variables de tipo evento más bien de variables delegate.