[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.27,0:00:01.89,Default,,0000,0000,0000,,Los Events (eventos) son unos delegates especializados Dialogue: 0,0:00:01.89,0:00:03.72,Default,,0000,0000,0000,,que son útiles para cuando usted quiere alertar Dialogue: 0,0:00:03.72,0:00:05.72,Default,,0000,0000,0000,,a otras clases que algo sucedió. Dialogue: 0,0:00:06.45,0:00:08.45,Default,,0000,0000,0000,,En práctica usted verá que los eventos Dialogue: 0,0:00:08.45,0:00:12.09,Default,,0000,0000,0000,,funcionan muy similar a los public multicast delegates. Dialogue: 0,0:00:12.86,0:00:14.62,Default,,0000,0000,0000,,Para más información acerca de delegates Dialogue: 0,0:00:14.62,0:00:17.07,Default,,0000,0000,0000,,ver la lección de delegates en el enlace abajo. Dialogue: 0,0:00:18.74,0:00:21.71,Default,,0000,0000,0000,,Un evento se puede pensar como un sistema de broadcast (difusión). Dialogue: 0,0:00:21.71,0:00:23.71,Default,,0000,0000,0000,,Cualquier clase que esté interesada en un evento Dialogue: 0,0:00:23.71,0:00:25.71,Default,,0000,0000,0000,,puede subscribir métodos a este. Dialogue: 0,0:00:26.55,0:00:28.91,Default,,0000,0000,0000,,Cuando esa situación específica ocurra, Dialogue: 0,0:00:28.91,0:00:32.46,Default,,0000,0000,0000,,como un click de un botón, o un power-up o una herida al jugador Dialogue: 0,0:00:32.46,0:00:34.46,Default,,0000,0000,0000,,nosotros invocamos nuestro evento y este de vuelta Dialogue: 0,0:00:34.46,0:00:37.11,Default,,0000,0000,0000,,llama los métodos de las clases suscritas. Dialogue: 0,0:00:38.50,0:00:40.50,Default,,0000,0000,0000,,Aquí nosotros tenemos una escena con 2 orbs. Dialogue: 0,0:00:40.94,0:00:43.75,Default,,0000,0000,0000,,Un orb tiene un script llamado TeleportScript Dialogue: 0,0:00:43.75,0:00:46.69,Default,,0000,0000,0000,,mientras que el otro tiene un script llamado TurnColorScript. Dialogue: 0,0:00:47.32,0:00:50.51,Default,,0000,0000,0000,,Adjuntado a nuestra cámara está el EventManagerScript. Dialogue: 0,0:00:51.37,0:00:54.47,Default,,0000,0000,0000,,Un evento se puede hacer para cualquier situación. Dialogue: 0,0:00:54.47,0:00:57.18,Default,,0000,0000,0000,,Pero en este ejemplo nosotros queremos invocar un evento Dialogue: 0,0:00:57.18,0:00:58.88,Default,,0000,0000,0000,,cuando el jugador haga click en un botón Dialogue: 0,0:00:58.88,0:01:00.88,Default,,0000,0000,0000,,que estamos dibujando a la pantalla. Dialogue: 0,0:01:01.96,0:01:03.96,Default,,0000,0000,0000,,En nuestro administrador de eventos (event manager) nosotros podemos ver Dialogue: 0,0:01:03.96,0:01:06.09,Default,,0000,0000,0000,,que hemos creado un tipo de delegate Dialogue: 0,0:01:06.09,0:01:08.09,Default,,0000,0000,0000,,que llamaremos ClickAction. Dialogue: 0,0:01:09.03,0:01:12.42,Default,,0000,0000,0000,,Podemos ver que cualquier método que desea estar subscrito Dialogue: 0,0:01:12.42,0:01:16.18,Default,,0000,0000,0000,,no debe tomar parámetros ni tener un tipo de retorno de void. Dialogue: 0,0:01:16.94,0:01:20.22,Default,,0000,0000,0000,,Luego nosotros creamos nuestra variable de evento. Dialogue: 0,0:01:20.22,0:01:23.26,Default,,0000,0000,0000,,Nosotros hacemos esto con la palabra clave Event. Dialogue: 0,0:01:23.80,0:01:26.24,Default,,0000,0000,0000,,Tenga en cuenta que esta variable también es estática Dialogue: 0,0:01:26.24,0:01:28.24,Default,,0000,0000,0000,,por la que podemos utilizar afuera de la clase Dialogue: 0,0:01:28.24,0:01:31.29,Default,,0000,0000,0000,,sin instanciar un objeto de esta clase. Dialogue: 0,0:01:32.62,0:01:36.30,Default,,0000,0000,0000,,Nuestra variable evento, que llamamos OnClicked Dialogue: 0,0:01:36.30,0:01:39.25,Default,,0000,0000,0000,,es el tipo de delegate que hemos creado arriba. Dialogue: 0,0:01:40.01,0:01:42.90,Default,,0000,0000,0000,,La única cosa es que la clase es responsable de Dialogue: 0,0:01:42.90,0:01:44.90,Default,,0000,0000,0000,,llamar el evento cuando la situación Dialogue: 0,0:01:44.90,0:01:46.62,Default,,0000,0000,0000,,apropiada suceda. Dialogue: 0,0:01:47.26,0:01:48.95,Default,,0000,0000,0000,,Como hemos mencionado antes, Dialogue: 0,0:01:48.95,0:01:50.95,Default,,0000,0000,0000,,nosotros llamaremos esto incluso cuando el jugador Dialogue: 0,0:01:50.95,0:01:52.30,Default,,0000,0000,0000,,haga click en un botón. Dialogue: 0,0:01:52.30,0:01:55.52,Default,,0000,0000,0000,,Por lo tanto, este script tiene un método OnGUI Dialogue: 0,0:01:56.73,0:01:58.63,Default,,0000,0000,0000,,Dentro del método OnGUI Dialogue: 0,0:01:58.63,0:02:00.63,Default,,0000,0000,0000,,nosotros hemos creado un botón en nuestra pantalla. Dialogue: 0,0:02:01.09,0:02:03.09,Default,,0000,0000,0000,,Cuando el jugador le hace click al botón Dialogue: 0,0:02:03.09,0:02:06.04,Default,,0000,0000,0000,,nosotros utilizamos una variable de evento como si fuera una función. Dialogue: 0,0:02:06.54,0:02:09.33,Default,,0000,0000,0000,,Esto en efecto invoca nuestro evento. Dialogue: 0,0:02:10.55,0:02:12.89,Default,,0000,0000,0000,,Por favor tenga en cuenta que como cualquier otro delegate Dialogue: 0,0:02:12.89,0:02:14.89,Default,,0000,0000,0000,,este causa un error si invocamos un evento Dialogue: 0,0:02:14.89,0:02:16.89,Default,,0000,0000,0000,,sin que tenga suscriptores. Dialogue: 0,0:02:16.89,0:02:18.89,Default,,0000,0000,0000,,Por lo tanto, siempre tenemos que asegurarnos Dialogue: 0,0:02:18.89,0:02:20.89,Default,,0000,0000,0000,,que el evento no sea igual a null Dialogue: 0,0:02:20.89,0:02:22.89,Default,,0000,0000,0000,,antes de invocarlo. Dialogue: 0,0:02:23.79,0:02:26.14,Default,,0000,0000,0000,,Si usted se acuerda de los 2 orbs en nuestra Dialogue: 0,0:02:26.14,0:02:29.39,Default,,0000,0000,0000,,escena, estos tienen 2 scripts diferentes adjuntos. Dialogue: 0,0:02:29.39,0:02:31.39,Default,,0000,0000,0000,,Estos 2 scripts van a funcionar como suscriptores Dialogue: 0,0:02:31.39,0:02:33.18,Default,,0000,0000,0000,,a este evento. Dialogue: 0,0:02:33.18,0:02:35.18,Default,,0000,0000,0000,,Miremos esto ahora. Dialogue: 0,0:02:36.50,0:02:38.50,Default,,0000,0000,0000,,En el TeleportScript nosotros hemos Dialogue: 0,0:02:38.50,0:02:40.50,Default,,0000,0000,0000,,creado un método llamado Teleport. Dialogue: 0,0:02:41.11,0:02:43.11,Default,,0000,0000,0000,,Este es el método al cual estaremos subscribiendo Dialogue: 0,0:02:43.11,0:02:46.02,Default,,0000,0000,0000,,al evento que hemos creado en el administrador de eventos (event manager). Dialogue: 0,0:02:46.82,0:02:50.10,Default,,0000,0000,0000,,Usted se dará cuenta que el método Teleport toma ningún parámetro Dialogue: 0,0:02:50.10,0:02:51.88,Default,,0000,0000,0000,,y tiene un tipo de retorno void, Dialogue: 0,0:02:51.88,0:02:53.58,Default,,0000,0000,0000,,como nuestro delegate. Dialogue: 0,0:02:54.29,0:02:56.29,Default,,0000,0000,0000,,El método Teleport es responsable del Dialogue: 0,0:02:56.29,0:02:59.49,Default,,0000,0000,0000,,posicionamiento del objeto de manera aleatoria a lo largo del eje Y. Dialogue: 0,0:03:00.28,0:03:01.98,Default,,0000,0000,0000,,Cerca de la parte superior de nuestro script Dialogue: 0,0:03:01.98,0:03:04.60,Default,,0000,0000,0000,,nosotros tenemos un método llamado OnEnable. Dialogue: 0,0:03:04.60,0:03:06.60,Default,,0000,0000,0000,,Este es un método integrado que será llamado Dialogue: 0,0:03:06.60,0:03:08.60,Default,,0000,0000,0000,,cuando el objeto que tiene este script Dialogue: 0,0:03:08.60,0:03:12.30,Default,,0000,0000,0000,,adjuntado es creado o habilitado en una escena. Dialogue: 0,0:03:13.18,0:03:15.35,Default,,0000,0000,0000,,Nosotros utilizaremos este método para subscribir nuestro Dialogue: 0,0:03:15.35,0:03:18.43,Default,,0000,0000,0000,,método Telport al evento OnClicked Dialogue: 0,0:03:18.43,0:03:20.62,Default,,0000,0000,0000,,del EventScript. Dialogue: 0,0:03:20.62,0:03:22.62,Default,,0000,0000,0000,,Podemos ver que subscribimos un método Dialogue: 0,0:03:22.62,0:03:25.47,Default,,0000,0000,0000,,a un evento utilizando el operador +=. Dialogue: 0,0:03:26.42,0:03:28.70,Default,,0000,0000,0000,,Al subscribir un método a un evento Dialogue: 0,0:03:28.70,0:03:30.100,Default,,0000,0000,0000,,nos estamos asegurando que cuando ese evento ocurra Dialogue: 0,0:03:30.100,0:03:32.100,Default,,0000,0000,0000,,nuestro método será llamado. Dialogue: 0,0:03:33.90,0:03:37.62,Default,,0000,0000,0000,,Luego nosotros tenemos un método OnDisable. Dialogue: 0,0:03:37.62,0:03:39.62,Default,,0000,0000,0000,,Opuesto al método OnEnable, Dialogue: 0,0:03:39.62,0:03:41.62,Default,,0000,0000,0000,,el método OnDisable es llamado cuando Dialogue: 0,0:03:41.62,0:03:45.01,Default,,0000,0000,0000,,un objeto es desactivado o destruido en una escena. Dialogue: 0,0:03:45.78,0:03:47.96,Default,,0000,0000,0000,,Dentro del método OnDisabled Dialogue: 0,0:03:47.96,0:03:50.75,Default,,0000,0000,0000,,nosotros estamos anulando la suscripción de nuestro método al evento. Dialogue: 0,0:03:51.33,0:03:53.22,Default,,0000,0000,0000,,Nosotros subscribimos un método de un evento Dialogue: 0,0:03:53.22,0:03:55.69,Default,,0000,0000,0000,,utilizando el operador -=. Dialogue: 0,0:03:56.51,0:03:58.51,Default,,0000,0000,0000,,Esto nos va asegurar que nuestro método no se Dialogue: 0,0:03:58.51,0:04:01.04,Default,,0000,0000,0000,,llame más cuando un evento ocurra. Dialogue: 0,0:04:02.23,0:04:04.23,Default,,0000,0000,0000,,Este paso es bastante importante Dialogue: 0,0:04:04.23,0:04:06.23,Default,,0000,0000,0000,,y el fallo de hacer esto puede llevar a pérdidas Dialogue: 0,0:04:06.23,0:04:08.23,Default,,0000,0000,0000,,de memoria y errores en nuestro juego. Dialogue: 0,0:04:08.84,0:04:10.84,Default,,0000,0000,0000,,Una buena regla es que cuando usted suscriba Dialogue: 0,0:04:10.84,0:04:12.84,Default,,0000,0000,0000,,un método a un evento usted debe Dialogue: 0,0:04:12.84,0:04:15.53,Default,,0000,0000,0000,,también cancelar una suscripción correspondientes. Dialogue: 0,0:04:17.02,0:04:19.02,Default,,0000,0000,0000,,Nuestro TurnColorScript Dialogue: 0,0:04:19.02,0:04:22.22,Default,,0000,0000,0000,,está estructurado muy similar a nuestro TeleportScript. Dialogue: 0,0:04:22.82,0:04:26.08,Default,,0000,0000,0000,,En este caso nosotros tenemos un método llamado TurnColor Dialogue: 0,0:04:26.08,0:04:28.08,Default,,0000,0000,0000,,que no toma parámetros y tiene un tipo Dialogue: 0,0:04:28.08,0:04:29.62,Default,,0000,0000,0000,,de retorno void. Dialogue: 0,0:04:30.41,0:04:32.07,Default,,0000,0000,0000,,El método TurnColor Dialogue: 0,0:04:32.07,0:04:34.96,Default,,0000,0000,0000,,vuelve el material del objeto en un color aleatorio. Dialogue: 0,0:04:35.52,0:04:38.18,Default,,0000,0000,0000,,Nuevamente, nosotros tenemos los métodos OnEnable Dialogue: 0,0:04:38.18,0:04:40.18,Default,,0000,0000,0000,,y OnDisable. Dialogue: 0,0:04:40.79,0:04:42.79,Default,,0000,0000,0000,,Esta vez, estos están suscribiendo Dialogue: 0,0:04:42.79,0:04:45.33,Default,,0000,0000,0000,,y anulando la suscripción de nuestro método TurnColor Dialogue: 0,0:04:45.33,0:04:46.86,Default,,0000,0000,0000,,del evento. Dialogue: 0,0:04:47.58,0:04:49.58,Default,,0000,0000,0000,,Vale la pena tener en cuenta en otro momento Dialogue: 0,0:04:49.58,0:04:51.58,Default,,0000,0000,0000,,que anulando la suscripción de nuestro método de un evento Dialogue: 0,0:04:51.58,0:04:54.23,Default,,0000,0000,0000,,es fundamental para utilizar eventos adecuadamente Dialogue: 0,0:04:54.23,0:04:56.23,Default,,0000,0000,0000,,y prevenir errores en nuestro código. Dialogue: 0,0:04:57.45,0:05:00.09,Default,,0000,0000,0000,,De vuelta en Unity nosotros podemos correr nuestra escena. Dialogue: 0,0:05:00.09,0:05:02.09,Default,,0000,0000,0000,,La primera cosa para tener en cuenta es el botón Dialogue: 0,0:05:02.09,0:05:03.80,Default,,0000,0000,0000,,que aparece cerca de la parte superior. Dialogue: 0,0:05:03.80,0:05:05.80,Default,,0000,0000,0000,,Cuando se haga click a este botón, se a invocará nuestro evento Dialogue: 0,0:05:05.80,0:05:09.12,Default,,0000,0000,0000,,y llamará los métodos Teleport y TurnColor. Dialogue: 0,0:05:09.12,0:05:11.12,Default,,0000,0000,0000,,Nosotros podemos hacer click en el botón múltiples veces Dialogue: 0,0:05:11.12,0:05:14.60,Default,,0000,0000,0000,,y cada vez los métodos suscriptores serán llamados. Dialogue: 0,0:05:15.84,0:05:17.84,Default,,0000,0000,0000,,Como podemos ver, nuestro administrador de eventos (event manager) Dialogue: 0,0:05:17.84,0:05:20.34,Default,,0000,0000,0000,,solamente necesita preocuparse acerca del evento en sí Dialogue: 0,0:05:20.34,0:05:22.58,Default,,0000,0000,0000,,y los factores desencadenantes al evento. Dialogue: 0,0:05:22.58,0:05:24.93,Default,,0000,0000,0000,,No necesitaba saber acerca del TeleportScript, Dialogue: 0,0:05:24.93,0:05:26.64,Default,,0000,0000,0000,,o el TurnColorScript. Dialogue: 0,0:05:27.26,0:05:31.06,Default,,0000,0000,0000,,Del mismo modo, el TeleportScript y TurnColorScript Dialogue: 0,0:05:31.06,0:05:33.06,Default,,0000,0000,0000,,no necesitaba saber acerca del otro. Dialogue: 0,0:05:33.92,0:05:35.92,Default,,0000,0000,0000,,De esta manera nosotros somos capaces de crear Dialogue: 0,0:05:35.92,0:05:38.91,Default,,0000,0000,0000,,un sistema de broadcast (difusión) muy robusto y flexible. Dialogue: 0,0:05:40.35,0:05:42.35,Default,,0000,0000,0000,,Usted se podría estar preguntando por qué utilizamos una variable Dialogue: 0,0:05:42.35,0:05:45.09,Default,,0000,0000,0000,,estática de evento en vez de una variable pública delegate Dialogue: 0,0:05:45.09,0:05:46.67,Default,,0000,0000,0000,,en nuestro administrador de eventos (event manager)? Dialogue: 0,0:05:47.35,0:05:50.20,Default,,0000,0000,0000,,La verdad es que usted puede lograr la misma Dialogue: 0,0:05:50.20,0:05:53.30,Default,,0000,0000,0000,,funcionalidad de eventos con variables públicas de delegates. Dialogue: 0,0:05:53.80,0:05:56.89,Default,,0000,0000,0000,,De hecho, como hemos mencionado al principio de esta lección, Dialogue: 0,0:05:56.89,0:05:59.88,Default,,0000,0000,0000,,los eventos son simplemente delegates especializados. Dialogue: 0,0:05:59.88,0:06:01.88,Default,,0000,0000,0000,,La razón por la cual nosotros utilizamos eventos sobre Dialogue: 0,0:06:01.88,0:06:04.85,Default,,0000,0000,0000,,variables públicas delegate para situaciones como esta Dialogue: 0,0:06:04.85,0:06:06.85,Default,,0000,0000,0000,,es que los eventos tienen una seguridad inherente Dialogue: 0,0:06:06.85,0:06:08.85,Default,,0000,0000,0000,,dónde las variables delegate no tienen. Dialogue: 0,0:06:09.43,0:06:11.43,Default,,0000,0000,0000,,Con eventos las otras clases Dialogue: 0,0:06:11.43,0:06:13.70,Default,,0000,0000,0000,,solamente se pueden suscribir y des-suscribir. Dialogue: 0,0:06:14.35,0:06:17.58,Default,,0000,0000,0000,,Si nosotros fuéramos a utilizar una variable pública delegate más bien Dialogue: 0,0:06:17.58,0:06:19.58,Default,,0000,0000,0000,,otras clases podrían invocar o Dialogue: 0,0:06:19.58,0:06:21.58,Default,,0000,0000,0000,,anular nuestra variable delegate para hacer Dialogue: 0,0:06:21.58,0:06:23.58,Default,,0000,0000,0000,,todo tipo de cosas nefastas. Dialogue: 0,0:06:24.43,0:06:27.35,Default,,0000,0000,0000,,En términos generales, si usted quiere crear un sistema de Dialogue: 0,0:06:27.35,0:06:30.58,Default,,0000,0000,0000,,métodos dinámicos que involucra más de 1 clase, Dialogue: 0,0:06:30.58,0:06:33.63,Default,,0000,0000,0000,,utilice variables de tipo evento más bien de variables delegate.