1 00:00:06,700 --> 00:00:25,640 Bueno, nos adentramos en el terreno de la animación y es que Unity, aparte de ser un motor de videojuegos, pues también permite crear animaciones dentro, lo cual es lógico porque muchas veces tenemos que animar elementos, no sólo para crear sprites animados, sino también para objetos que se mueven, desde una nube que pasa, una palanca que se baja o una puerta que se abre. 2 00:00:25,640 --> 00:00:30,239 Incluso se pueden animar cámaras para crear escenas cinemáticas 3 00:00:30,239 --> 00:00:33,619 Pero antes de empezar tenemos que entender que Unity tiene dos herramientas básicas 4 00:00:33,619 --> 00:00:35,600 Que son el Animation y el Animator 5 00:00:35,600 --> 00:00:41,520 Ya sé que se parecen mucho en el nombre pero son distintas y en muchos casos complementarias 6 00:00:41,520 --> 00:00:44,420 Vamos a empezar por la primera de todas que es el Animation 7 00:00:44,420 --> 00:00:49,579 Que nos permite crear animaciones a través de una línea de tiempo como se hacen en programas habituales de animación 8 00:00:49,579 --> 00:01:03,759 Si nos vamos a Unity, podemos abrir la ventana de Animation dentro del menú de Window, nos vamos a la sección de Animation y veremos que efectivamente, como decía, tenemos la opción de Animation y la de Animator. 9 00:01:04,400 --> 00:01:11,859 Bien, si le abrimos la Animation, veremos que se nos abre una línea de tiempo, pero obviamente no tenemos nada, ninguna animación creada. 10 00:01:11,859 --> 00:01:15,219 para ello lo que tenemos que hacer es seleccionar un elemento de nuestra escena 11 00:01:15,219 --> 00:01:19,400 voy a hacer un ejercicio clásico en la animación 12 00:01:19,400 --> 00:01:22,099 que es la de animar una pelota que bota 13 00:01:22,099 --> 00:01:23,819 de hecho voy a crear un plano 14 00:01:23,819 --> 00:01:26,599 y voy a crear también una esfera 15 00:01:26,599 --> 00:01:28,519 y la voy a llevar a 0 16 00:01:28,519 --> 00:01:31,439 pero en este caso la voy a dejar en 5 17 00:01:31,439 --> 00:01:33,060 y Z0 18 00:01:33,060 --> 00:01:33,540 muy bien 19 00:01:33,540 --> 00:01:36,799 veremos que ahora sí, si abro la ventana de Animation 20 00:01:36,799 --> 00:01:41,340 al tener un objeto de nuestra escena seleccionado 21 00:01:41,340 --> 00:01:45,420 ahora sí que me está preguntando si quiero crear una animación a partir de 22 00:01:45,420 --> 00:01:49,620 ese game object le voy a decir que sí y una cosa que tenemos que entender es que 23 00:01:49,620 --> 00:01:55,379 las animaciones se guardan en nuestro proyecto de unity tanto el animation que 24 00:01:55,379 --> 00:01:58,019 es lo que va a guardar ahora como el animator que es la que gestiona las 25 00:01:58,019 --> 00:02:01,719 diferentes animaciones del mismo objeto que lo veremos más adelante así que muy 26 00:02:01,719 --> 00:02:07,500 importante como siempre elegir una buena ubicación de hecho voy a crear un nuevo 27 00:02:07,500 --> 00:02:11,819 folder en mis assets que se va a llamar animations 28 00:02:11,819 --> 00:02:17,039 de momento lo voy a guardar aquí le voy a llamar bota pelota 29 00:02:17,039 --> 00:02:22,080 safe y si nos fijamos en la carpeta que he creado veremos que ha creado dos 30 00:02:22,080 --> 00:02:27,659 archivos uno este el que tiene un icono como de play que es el animation que es 31 00:02:27,659 --> 00:02:32,639 lo que estoy ahora mismo editando pero ha creado otro que es el animator 32 00:02:32,639 --> 00:02:39,120 De hecho, el animator, si nos vamos a Window, Animation y Animator, veremos que abre un panel nuevo, que es este. 33 00:02:39,520 --> 00:02:44,879 El animator lo veremos más adelante, pero básicamente es el que gestiona cómo nuestro objeto pasa de una animación a otra. 34 00:02:45,099 --> 00:02:48,699 Eso es lógico, por ejemplo, en personajes que están corriendo, luego saltan, luego se agachan. 35 00:02:49,060 --> 00:02:53,340 Entonces cada uno tiene su animación y de alguna forma tenemos que decirle cómo y cuándo pasa de una a otra. 36 00:02:53,719 --> 00:02:58,580 Eso lo haremos más adelante con el animator, pero de momento nos quedaremos con el animation, que es este de aquí. 37 00:02:58,580 --> 00:03:00,719 Y como podemos ver, ya se nos abre una línea de tiempo. 38 00:03:01,159 --> 00:03:08,000 De hecho, este panel es tan importante que lo voy a anclar aquí abajo porque ya lo voy a estar usando constantemente. 39 00:03:08,639 --> 00:03:12,020 Para poder empezar a animar, tengo que seleccionar mi objeto. 40 00:03:12,979 --> 00:03:14,599 Voy a empezar por algo muy importante. 41 00:03:15,159 --> 00:03:18,759 Podemos crear tantas animaciones como queramos, en este caso, en nuestra pelota. 42 00:03:18,759 --> 00:03:24,819 Y de hecho, ahora mismo hemos creado una que se llama Bota Pelota, que se corresponde con esta. 43 00:03:25,680 --> 00:03:27,280 Pero yo podría crear más. 44 00:03:27,280 --> 00:03:29,379 si desplegamos este 45 00:03:29,379 --> 00:03:31,159 donde tenemos aquí 46 00:03:31,159 --> 00:03:32,500 podemos crear un nuevo clip 47 00:03:32,500 --> 00:03:34,900 y entonces le podemos llamar por ejemplo 48 00:03:34,900 --> 00:03:37,280 bota y en este caso le voy a decir 49 00:03:37,280 --> 00:03:38,479 que explota 50 00:03:38,479 --> 00:03:41,099 y si nos fijamos ha creado 51 00:03:41,099 --> 00:03:42,039 su propio archivo 52 00:03:42,039 --> 00:03:45,219 de explotar que se corresponde con el que 53 00:03:45,219 --> 00:03:47,379 tenemos aquí y podemos movernos de uno a otro 54 00:03:47,379 --> 00:03:48,919 entonces quiero que eso quede claro 55 00:03:48,919 --> 00:03:51,180 que nosotros podemos crear tantas animaciones como queramos 56 00:03:51,180 --> 00:03:53,159 en un mismo objeto y luego mediante 57 00:03:53,159 --> 00:03:54,699 el animator gestionarlo 58 00:03:54,699 --> 00:03:56,659 pero vamos a hacer que bote, podemos hacerlo 59 00:03:56,659 --> 00:04:03,699 varias de varias formas la más cómoda ahora mismo para mí es la de darle el botón de grabar que como 60 00:04:03,699 --> 00:04:08,259 cualquier programa de grabación significa que a partir de este momento cualquier modificación que 61 00:04:08,259 --> 00:04:13,620 hagan en las propiedades de mi objeto por supuesto las de transformar la posición la escala la 62 00:04:13,620 --> 00:04:19,360 rotación va a quedar registrado como un fotograma clave para luego interpolar ahora mismo no se ha 63 00:04:19,360 --> 00:04:25,939 creado ningún fotograma clave pero si yo quisiese crearlo pues nada no tenía más que mover el objeto 64 00:04:25,939 --> 00:04:30,019 veis lo estoy moviendo en el eje y y automáticamente como podemos ver se ha 65 00:04:30,019 --> 00:04:33,680 creado un fotograma clave en que se ha creado una fotograma clave en los 66 00:04:33,680 --> 00:04:38,600 parámetros de posición con la rueda del ratón podemos alejarnos en la línea de 67 00:04:38,600 --> 00:04:44,959 tiempo entonces puedo ponerme por ejemplo en el fotograma 60 que es un 68 00:04:44,959 --> 00:04:49,160 segundo pero estoy trabajando a 60 fotogramas por segundo y voy a hacer que 69 00:04:49,160 --> 00:04:56,980 la pelota baje y además lo voy a hacer aquí directamente hasta aquí que toca el 70 00:04:56,980 --> 00:05:07,160 suelo y me voy a ir al segundo en el fotograma 120 pues podría volver a subirlo y estaría si 71 00:05:07,160 --> 00:05:14,019 me sé los parámetros después los puedo escribir aquí directamente y como estoy en el modo grabación 72 00:05:14,019 --> 00:05:20,399 se crea bien pues ya tengo la pelota que bota podemos hacerlo con cualquier parámetro por 73 00:05:20,399 --> 00:05:25,199 ejemplo si yo quiero que se escale cuando toca el suelo aquí yo en este caso no le voy a dar 74 00:05:25,199 --> 00:05:32,540 grabar sino que directamente le voy a dar en add property y como podemos ver se nos abre la ventana 75 00:05:32,540 --> 00:05:36,660 donde tienen todas las propiedades que podemos animar no todas se pueden animar y depende además 76 00:05:36,660 --> 00:05:41,399 de qué objeto tengamos en este caso es un objeto 3d las luces tienen otras propiedades para animar 77 00:05:41,399 --> 00:05:46,959 y en fin pero por ejemplo por supuesto tengo todas las propiedades de transform en este caso 78 00:05:46,959 --> 00:05:57,899 la escala. Entonces le digo que añada aquí una propiedad de escala. De forma que yo le 79 00:05:57,899 --> 00:06:05,750 voy a crear un fotograma clave aquí. Si hacemos un doble clic se nos crea allá donde hagamos 80 00:06:05,750 --> 00:06:12,129 un clic. Entonces yo le puedo decir que en este punto tiene una escala y en este punto 81 00:06:12,129 --> 00:06:19,019 por ejemplo la voy a achatar. Aquí sí le voy a dar a grabar de forma que entro en la 82 00:06:19,019 --> 00:06:26,379 modificación de la escala y la escaló en la vertical y aquí le voy a decir que 83 00:06:26,379 --> 00:06:34,649 tiene una escala de 1 y aquí tiene una escala de 1 84 00:06:34,649 --> 00:06:41,860 de forma que cuando toca el suelo se deforma y ahí está voy a parar la 85 00:06:41,860 --> 00:06:50,990 grabación podemos darle al play ahí tenemos una pelota que bota si queremos 86 00:06:50,990 --> 00:06:54,629 actuar sobre las aceleraciones pues como los que ya hayáis tocado algo de 87 00:06:54,629 --> 00:06:58,110 animación sabéis que lo más preciso es trabajar con curvas y esa opción la 88 00:06:58,110 --> 00:07:02,290 tiene unity aquí abajo en curvas donde efectivamente podéis seleccionar la 89 00:07:02,290 --> 00:07:06,569 propiedad que estáis animando en este caso por ejemplo el movimiento ni y viene 90 00:07:06,569 --> 00:07:10,350 aquí tocando las tangentes de las animaciones o incluso con el botón 91 00:07:10,350 --> 00:07:14,750 derecho si pinchamos sobre ella pues tenemos varias opciones para ajustar las 92 00:07:14,750 --> 00:07:18,930 aceleraciones y cómo queremos que se comporte esto que hemos hecho ha sido 93 00:07:18,930 --> 00:07:23,189 animar un objeto 3d ahora cómo se anima un objeto 2d pues prácticamente de la 94 00:07:23,189 --> 00:07:31,110 misma forma, lo único que lo vamos a hacer mediante un atajo y es que si yo me voy a por ejemplo este 95 00:07:31,110 --> 00:07:37,310 sprite que antes he recortado, veo por ejemplo que todo esto es una animación de correr, pero este 96 00:07:37,310 --> 00:07:43,670 sprite animado no sólo tenía correr, por ejemplo tenía esta que es para saltar y para caer. Entonces 97 00:07:43,670 --> 00:07:49,550 si yo selecciono todas las de correr, que es todas estas, las he seleccionado con la mayúscula y el 98 00:07:49,550 --> 00:07:57,290 cursor, si yo las arrastro a nuestra escena, tal cual, todas seleccionadas, veremos que 99 00:07:57,290 --> 00:08:00,550 me está pidiendo guardar una animación, es decir, lo mismo que hemos hecho antes, 100 00:08:00,850 --> 00:08:06,970 de crear una animation y dónde lo guardo. Muy importante darle el nombre que represente 101 00:08:06,970 --> 00:08:11,589 la animación, en este caso es la de correr, así que le voy a llamar run. Y si nos fijamos, 102 00:08:14,120 --> 00:08:21,819 igual que hemos hecho antes animando un objeto 3D, se nos ha creado el animation y un animator 103 00:08:21,819 --> 00:08:27,379 Controller que es el que luego va a gestionar las animaciones. Tenemos este personaje que ha 104 00:08:27,379 --> 00:08:37,220 traído a la escena y si nos fijamos también tiene un componente animator vinculado al animator que 105 00:08:37,220 --> 00:08:44,179 ha creado. Si yo ahora mismo le diese al play al juego efectivamente veremos que se ejecuta la 106 00:08:44,179 --> 00:08:51,379 animación. Ahí está. Que se corresponde con esta de aquí. Recuerdo que si no tengo seleccionado 107 00:08:51,379 --> 00:08:55,379 mi personaje, no me aparecerá aquí nada, pero en cuanto selecciono mi personaje 108 00:08:55,379 --> 00:08:58,639 que tiene la animación creada, pues ahí están, voy a echarle hacia atrás 109 00:08:58,639 --> 00:09:03,539 un truco, y es que si por ejemplo 110 00:09:03,539 --> 00:09:07,519 quisiese que corriese más despacio, yo puedo seleccionar todos los keyframes 111 00:09:07,519 --> 00:09:11,139 en este caso, cada keyframe se corresponde con un sprite 112 00:09:11,139 --> 00:09:15,480 si nos fijamos, ya no modificamos propiedades, ya no modificamos 113 00:09:15,480 --> 00:09:19,279 posiciones o escalas, sino que cada 114 00:09:19,279 --> 00:09:27,700 keyframe representa una imagen. Pues bien, si seleccionamos todas y cogemos esta barra 115 00:09:27,700 --> 00:09:43,419 que nos aparece, nos permite modificarlas todas de forma uniforme. Una cosa, aunque 116 00:09:43,419 --> 00:09:47,360 ahora mismo no viene mucho a cuento, en este sprite está bien hecho y su último fotograma 117 00:09:47,360 --> 00:09:52,039 corresponde perfectamente al fotograma anterior al primer fotograma, con lo cual la animación 118 00:09:52,039 --> 00:09:56,559 es súper fluida. Pero hay veces en las que el último fotograma repite el primer fotograma 119 00:09:56,559 --> 00:10:01,279 Y en ese caso se produce una especie de pausa porque hay un fotograma que se repite. 120 00:10:01,740 --> 00:10:06,480 Cuando eso nos ocurra, veremos que si seleccionamos la animación, aquí en nuestro proyecto, 121 00:10:06,980 --> 00:10:10,259 tiene aquí varias opciones. Una que es el loop time, que ahora no tiene efecto, 122 00:10:10,379 --> 00:10:14,399 pero cuando vemos el animator sí que tiene efecto para que cuando termine la animación se pare. 123 00:10:15,840 --> 00:10:22,700 Y tenemos aquí un loop pause, que lo que hace es, como bien dice ahí, hacer una animación sin juntas. 124 00:10:22,700 --> 00:10:27,700 y entonces lo que hace es que el último fotograma se ejecuta al mismo tiempo 125 00:10:27,700 --> 00:10:31,519 que el primero y entonces no se produce esa especie de pausa 126 00:10:31,519 --> 00:10:35,539 pero bueno, en este caso insisto, está bien hecha así que no necesito, pero lógicamente este personaje 127 00:10:35,539 --> 00:10:39,419 también tiene que saltar y como hemos visto antes 128 00:10:39,419 --> 00:10:43,159 esta es la animación que hemos creado, ya la he llamado run 129 00:10:43,159 --> 00:10:46,620 insisto, hay que ponerle bien los nombres, vamos a crear una nueva 130 00:10:46,620 --> 00:10:51,399 muy importante, tenemos que seleccionar el elemento dentro de nuestra ventana 131 00:10:51,399 --> 00:10:59,620 de jerarquía, ahora ya sí, nos permite desplegar y nos permite decirle crear un nuevo clip. 132 00:11:00,120 --> 00:11:08,259 De nuevo nos pide que lo guardemos, muy importante, y a este le voy a llamar Jump. Está vacío 133 00:11:08,259 --> 00:11:16,480 pero ahora sí, cojo los sprites, busco en los que está saltando, este y este y este 134 00:11:16,480 --> 00:11:21,460 y este. Pues esos cuatro y los arrastro a mi animación. 135 00:11:23,220 --> 00:11:26,200 Como podemos ver, ahora ya sí, estos sí que necesito 136 00:11:26,200 --> 00:11:29,879 prolongarlos. A lo mejor los dos primeros 137 00:11:29,879 --> 00:11:37,149 que vayan muy juntos, pero el siguiente ya que se quede ahí. 138 00:11:37,970 --> 00:11:41,149 De hecho, en esta animación sí que me interesa, insisto que 139 00:11:41,149 --> 00:11:45,370 aunque ahora no lo vamos a ver, sí que me interesa que no sea en bucle, porque lo que va a determinar 140 00:11:45,370 --> 00:11:48,970 que pase de saltar a volver a correr no es que termine la animación. 141 00:11:48,970 --> 00:11:52,070 es lo que haremos a continuación en el animator 142 00:11:52,070 --> 00:11:55,549 pero eso sí, necesito que se quede quieto 143 00:11:55,549 --> 00:11:57,950 por lo tanto voy a seleccionar esa animación 144 00:11:57,950 --> 00:11:58,690 la de jump 145 00:11:58,690 --> 00:12:00,889 y le voy a decir que loop time 146 00:12:00,889 --> 00:12:02,269 en este caso, no 147 00:12:02,269 --> 00:12:04,470 aquí se sigue ejecutando en bucle 148 00:12:04,470 --> 00:12:06,230 pero no os preocupéis que luego en el animator 149 00:12:06,230 --> 00:12:08,350 sí que se detendrá en el último fotograma 150 00:12:08,350 --> 00:12:11,649 ya tenemos dos animaciones vinculadas a un sprite 151 00:12:11,649 --> 00:12:13,429 en este caso a un personaje 152 00:12:13,429 --> 00:12:15,529 y ahora tendríamos que ir al animator 153 00:12:15,529 --> 00:12:16,769 al control de animaciones 154 00:12:16,769 --> 00:12:18,509 para determinar cuándo pasa de una a otra 155 00:12:18,509 --> 00:12:25,110 y ahí ya sí que tendremos que entrar en código, pero antes de hacerlo quiero que veamos una función muy útil en el Animation 156 00:12:25,110 --> 00:12:30,629 y que nos va a servir para integrar las animaciones que hemos creado en eventos que creemos mediante código. 157 00:12:31,230 --> 00:12:33,309 Para ello tenemos los llamados eventos. 158 00:12:33,710 --> 00:12:39,169 Bien, para explicar lo que son los eventos voy a ir a mi animación anterior, que era la pelota que botaba, 159 00:12:39,509 --> 00:12:43,090 la selecciono y como podemos ver es una pelota que bota, así más. 160 00:12:43,090 --> 00:12:51,610 Bien, pues lo que yo quiero, por ejemplo, y esto es solo un ejemplo, es que cuando toque el suelo suene algo 161 00:12:51,610 --> 00:12:54,889 Y eso lo podemos hacer, lógicamente, mediante código 162 00:12:54,889 --> 00:12:59,649 Ya veremos más en detalle cómo crear sonidos o ejecutar sonidos 163 00:12:59,649 --> 00:13:08,850 Pero lo único que necesito es que en un momento de la animación se ejecute un método, una función de un script 164 00:13:08,850 --> 00:13:11,570 Eso se hace mediante los eventos 165 00:13:11,570 --> 00:13:28,690 De hecho, lo primero que voy a hacer es a mi esfera añadirle un script, le voy a llamar bote, por ejemplo, le podemos llamar como queramos, como siempre, organización. 166 00:13:31,730 --> 00:13:39,470 Bien, y si me voy a este script, voy a borrar los métodos que vienen por defecto, no los voy a usar en este caso, voy a crear el mío propio. 167 00:13:39,470 --> 00:14:01,490 Va a ser un método, llamar por ejemplo sonido votar, no le pido ningún parámetro, luego veremos que sí que podemos pasarle parámetros a través de nuestra animación, pero no voy a hacer ahora que suene un sonido, solo voy a mandar algo a consola para que veamos que efectivamente funciona, luego ya más adelante lo podremos hacer todo lo complejo que queramos. 168 00:14:01,490 --> 00:14:05,549 así que mando a consola 169 00:14:05,549 --> 00:14:10,409 ha tocado suelo 170 00:14:10,409 --> 00:14:13,450 y ahora volviendo a Unity 171 00:14:13,450 --> 00:14:15,149 la cuestión está en cómo 172 00:14:15,149 --> 00:14:17,309 desde el panel de Animation 173 00:14:17,309 --> 00:14:19,409 puedo yo mandarle una orden 174 00:14:19,409 --> 00:14:21,649 al script vinculado con este GameObject 175 00:14:21,649 --> 00:14:22,450 pues muy sencillo 176 00:14:22,450 --> 00:14:24,070 me pongo en el momento 177 00:14:24,070 --> 00:14:26,210 en el que quiero que se ejecute 178 00:14:26,210 --> 00:14:27,409 por ejemplo en este momento 179 00:14:27,409 --> 00:14:28,450 que es cuando ha tocado el suelo 180 00:14:28,450 --> 00:14:30,309 y aquí lo tenemos 181 00:14:30,309 --> 00:14:31,929 añadir evento 182 00:14:31,929 --> 00:14:33,149 es este botoncito de aquí 183 00:14:33,149 --> 00:14:34,049 Add Event 184 00:14:34,049 --> 00:14:36,470 y veremos que se nos abre 185 00:14:36,470 --> 00:14:39,070 el inspector de ese evento 186 00:14:39,070 --> 00:14:42,509 que lo podemos volver, vemos que se ha añadido aquí un evento 187 00:14:42,509 --> 00:14:44,490 y podemos siempre volver a él y clicarle 188 00:14:44,490 --> 00:14:48,649 y nos pregunta qué función queremos o qué método 189 00:14:48,649 --> 00:14:51,350 queremos que ejecute cuando pase por ese punto 190 00:14:51,350 --> 00:14:54,809 entonces le voy a poner, como podéis ver, aparece la función 191 00:14:54,809 --> 00:14:57,529 sonido botar. Voy a abrir el panel 192 00:14:57,529 --> 00:15:00,509 de consola, que no lo tengo abierto ahora mismo 193 00:15:00,509 --> 00:15:04,809 lo voy a poner aquí para que lo veamos, clear 194 00:15:04,809 --> 00:15:07,549 y ahora si ejecutamos el juego 195 00:15:07,549 --> 00:15:12,549 veremos que la pelota bota y efectivamente cada vez que toque el suelo 196 00:15:12,549 --> 00:15:16,789 veis, manda a consola 197 00:15:16,789 --> 00:15:20,750 ese mensaje, y ahora mismo 198 00:15:20,750 --> 00:15:24,929 esa función no exige ninguna variable 199 00:15:24,929 --> 00:15:28,690 pero nosotros se lo podemos dar, por ejemplo el método sonido botar 200 00:15:28,690 --> 00:15:32,570 me pide una variable de tipo string que se va a llamar 201 00:15:32,570 --> 00:15:35,809 mensaje, y le digo 202 00:15:35,809 --> 00:15:44,759 mensaje del evento concatenado 203 00:15:44,759 --> 00:15:48,740 con la variable. Veremos que al seleccionar 204 00:15:48,740 --> 00:15:52,740 el evento, y si nos fijamos ahora en el inspector, no sólo 205 00:15:52,740 --> 00:15:56,779 tenemos que decir qué función se tiene que ejecutar, sino también qué parámetro nos está 206 00:15:56,779 --> 00:16:00,480 pidiendo esa función, concretamente una variable de tipo string. 207 00:16:00,879 --> 00:16:04,580 Pues le voy a decir hola mundo. Con lo cual, 208 00:16:04,759 --> 00:16:08,700 si ahora lanzo el juego y nos vamos a la consola, veremos que cada vez 209 00:16:08,700 --> 00:16:10,440 que la pelota bota 210 00:16:10,440 --> 00:16:12,539 me sale el mensaje 211 00:16:12,539 --> 00:16:14,059 hola mundo 212 00:16:14,059 --> 00:16:16,899 y con esto ya tenemos una herramienta tremenda 213 00:16:16,899 --> 00:16:18,639 para crear animaciones 214 00:16:18,639 --> 00:16:20,559 ya sea en 2D o en 3D 215 00:16:20,559 --> 00:16:22,120 y vincularlo con el código 216 00:16:22,120 --> 00:16:24,679 y ya de nuevo como siempre ocurre 217 00:16:24,679 --> 00:16:25,980 con el tema de la programación 218 00:16:25,980 --> 00:16:27,679 la imaginación es el límite