1 00:00:00,000 --> 00:00:09,640 Vale, en la tutoría de hoy estaba hablando ahora con uno de vosotros, con un compañero 2 00:00:09,640 --> 00:00:15,800 que ha asistido, sobre la tarea 2 y bueno, que a veces es un poco frustrante no dar al 3 00:00:15,800 --> 00:00:22,640 mejor con el enfoque con el que se van resolviendo lo que se pide las prácticas, ¿no? 4 00:00:22,640 --> 00:00:27,480 Pero es normal que tarde un poco en llegar a la solución, ¿me explico? 5 00:00:27,480 --> 00:00:32,640 a medida que se va teniendo más soltura y se va conociendo mejor el lenguaje de programación 6 00:00:32,640 --> 00:00:40,740 por ejemplo en este caso, pues es más fácil caer en una forma de resolver algo que nunca 7 00:00:40,740 --> 00:00:44,360 habías tenido antes que enfrentarte, pero lo importante es que el código que vayamos 8 00:00:44,360 --> 00:00:47,480 viendo o que vayáis escribiendo entendáis qué es. 9 00:00:47,480 --> 00:00:52,800 Antes lo ha dicho este compañero, que es verdad que está la frase de que la mitad 10 00:00:52,800 --> 00:00:56,200 del tiempo de trabajo de un programador es estar mirando en Google para dar con las 11 00:00:56,200 --> 00:01:05,640 soluciones o porque es un nuevo enfoque, que si a veces os perdéis un poco en el enfoque, 12 00:01:05,640 --> 00:01:08,600 que es normal, hay que dar con ello. 13 00:01:08,600 --> 00:01:13,320 También le comentaba, bueno, para resolver dudas una vez ya estéis estancados y no sepáis 14 00:01:13,320 --> 00:01:19,240 salir, recordad que tenéis el foro para escribirme y en un tutorial como este, ahora por ejemplo 15 00:01:19,240 --> 00:01:28,360 voy a resolver alguna duda que hay en el foro sobre la tarea 2 y plantando dudas sobre 16 00:01:28,360 --> 00:01:31,880 todo cuando os atajeéis de una forma imposible de avanzar. 17 00:01:31,880 --> 00:01:37,840 Y luego hay otra fórmula que no sé si alguno ya ha investigado que es las herramientas 18 00:01:37,840 --> 00:01:41,680 de inteligencia artificial, y esto no es para que os haga las prácticas, además no es 19 00:01:41,680 --> 00:01:45,720 posible que os haga una práctica de las que estamos planteando, pero a veces cuando tengáis 20 00:01:45,720 --> 00:01:52,800 dudas en un código podéis copiar ese código, por ejemplo en ChatGPT, y decirle oye explícame 21 00:01:52,800 --> 00:01:57,560 línea a línea qué es este código y a lo mejor os da unas indicaciones, unas pistas 22 00:01:57,560 --> 00:02:03,560 o os sugiere otros enfoques y esto sólo sirve si vais entendiendo las bases de programación 23 00:02:03,560 --> 00:02:04,560 y de código. 24 00:02:04,560 --> 00:02:09,920 Una vez eso, pues estas herramientas precisamente se están creando para ayudarnos, entonces 25 00:02:09,920 --> 00:02:14,560 también podéis explorarlas, no está prohibido que uséis ChatGPT, ChatGPT tiene la pega 26 00:02:14,560 --> 00:02:20,560 de que os puede escribir un script pero luego lo tenéis que implementar, ubicarlo bien, 27 00:02:20,560 --> 00:02:24,720 pasar las variables, es decir, hasta que no se entiende cómo funciona o qué hace cada 28 00:02:24,720 --> 00:02:30,160 componente dentro del editor de Unity, es una ayuda, pero no es sustitutivo, al menor 29 00:02:30,160 --> 00:02:31,160 de momento. 30 00:02:31,160 --> 00:02:36,440 Por tanto, os digo esto también por si en algún momento os bloqueáis, que sé que 31 00:02:36,440 --> 00:02:42,720 es muy frustrante y es normal, que yo cuando doy las clases sé por dónde tirar porque 32 00:02:42,720 --> 00:02:47,160 ya lo he resuelto, ya me he enfrentado y ya lo he solucionado y aparte también a veces 33 00:02:47,160 --> 00:02:53,800 tengo hasta una chuleta aquí por si alguna cosa que sé que no me va a salir, es decir, 34 00:02:53,800 --> 00:02:58,160 que es normal, que cueste y a veces es darle vueltas y cambiar y modificar, ¿vale? 35 00:02:58,160 --> 00:03:02,400 Simplemente que me parece importante en este momento del curso que ya empezamos a meternos 36 00:03:02,400 --> 00:03:09,840 en cosas más complejas y que implica usar muchos ingredientes, pues creo que es importante 37 00:03:09,840 --> 00:03:10,840 comentar esto. 38 00:03:10,960 --> 00:03:21,000 No sé si tenéis alguna duda de primeras que queráis resolver, si no paso con las 39 00:03:21,000 --> 00:03:24,000 que hay en el foro o lo que han escrito. 40 00:03:24,000 --> 00:03:27,640 Voy a compartir pantalla también. 41 00:03:27,640 --> 00:03:40,560 Vale, pues me dicen que hay dudas sobre la tarea de la unidad 3. 42 00:03:40,560 --> 00:03:49,880 Si te parece, eso, explico alguna cosilla que creo relevante del tema 2 y de las dudas 43 00:03:49,880 --> 00:03:53,000 que había y pasamos a eso, ¿te parece? 44 00:03:53,160 --> 00:04:00,160 Venga, pues a ver, tengo aquí preparado en el foro de la unidad 2, lo pongo aquí, entiendo, 45 00:04:00,160 --> 00:04:01,880 se ve la pantalla, ¿verdad? 46 00:04:01,880 --> 00:04:07,560 Se está viendo, confirmadme, no vaya a ser que me ponga a hablar y que ya ha pasado veces. 47 00:04:07,560 --> 00:04:13,080 Vale, perfecto, muchas gracias, se ve. 48 00:04:13,080 --> 00:04:14,080 Todo bien, vale. 49 00:04:14,080 --> 00:04:19,560 Una compañera, bueno, puso una frase que como ya os he dicho, que a veces es habitual, ¿vale? 50 00:04:19,560 --> 00:04:26,480 Hay que tranquilizarse y bueno, aquí hizo bien en preguntar y buscar en internet. 51 00:04:26,480 --> 00:04:34,120 Vale, ponía que ya había conseguido que la nave fuera hacia adelante. 52 00:04:34,120 --> 00:04:37,840 Dejé la respuesta por aquí, voy a comentar un poco lo que le puse, pero por favor, sé 53 00:04:37,840 --> 00:04:42,320 que son los enunciados de las tareas muy largos y en alguna tarea, creo que de hecho en esta, 54 00:04:42,320 --> 00:04:46,240 ponía leed primero todo el enunciado con atención y luego ya empezáis otra vez de 55 00:04:46,240 --> 00:04:51,560 arriba a abajo para tener primero toda la imagen de la tarea y luego ya se va desglosando. 56 00:04:51,560 --> 00:04:55,160 Porque ponía que la nave salía disparada hacia adelante y había conseguido moverla 57 00:04:55,160 --> 00:04:59,240 en profundidad y era algo que precisamente indicaba que no había que hacer, es decir, 58 00:04:59,240 --> 00:05:02,960 lo que se iban a mover hacia la cámara son los obstáculos, ¿vale? 59 00:05:02,960 --> 00:05:11,400 Entonces, aquí había generado varias variables, también hay un problema a veces que es normal, 60 00:05:11,400 --> 00:05:16,120 me consultéis a través del foro, que es que necesito contexto, porque a lo mejor 61 00:05:16,120 --> 00:05:20,920 un código es algo muy evidente lo que está fallando o lo que me preguntáis, pero en 62 00:05:20,920 --> 00:05:25,640 otros no sé por qué estáis empleando ciertas cosas y es verdad que es complejo, si no estoy 63 00:05:25,640 --> 00:05:28,440 ahí con vosotros en el ordenador, que me lo transmitáis, ¿vale? 64 00:05:28,440 --> 00:05:33,560 Por ejemplo, la otra duda, había alguna captura de imagen un poco más concreta, ¿vale? 65 00:05:33,560 --> 00:05:39,880 Pero bueno, cosas que hay que tener en cuenta, que vi aquí, que dijo la compañera, es que 66 00:05:40,040 --> 00:05:46,720 una parte vi que dentro del update hacía operaciones que entiendo que no eran muy 67 00:05:46,720 --> 00:05:52,680 conscientes de qué buscaban, porque por ejemplo, aquí ve un condicional que es si al pulsar la 68 00:05:52,680 --> 00:06:00,560 tecla W y luego pone bastantes condiciones o cosas que quiere que se ejecute con esa 69 00:06:00,560 --> 00:06:04,240 condición, porque si no la condición aquí ahora mismo no está haciendo nada, recordad que hay que 70 00:06:04,240 --> 00:06:09,520 poner las llaves, lo ponía aquí un poco más abajo, si ponemos esta orden estamos poniendo que al 71 00:06:09,520 --> 00:06:16,440 pulsar W solo va a ejecutar la primera línea, ¿vale? Veréis en los apuntes a veces, por ejemplo, 72 00:06:16,440 --> 00:06:23,200 en el apartado que hay sobre las interacciones, que pone ejemplos, que pone si pulsas el botón 73 00:06:23,200 --> 00:06:28,560 izquierdo del ratón ocurre esto, si es solo una instrucción no hace falta abrir llaves, ¿vale? 74 00:06:28,560 --> 00:06:33,520 Y se ejecuta la siguiente línea o instrucción hasta el punto y coma. Si vamos a poner más, 75 00:06:33,520 --> 00:06:38,640 aquí solo hay una, aquí habría que ver, esto sería la versión, si es lo que quería hacer la compañera, 76 00:06:39,360 --> 00:06:45,160 al pulsar W se ejecuta todo esto si se cumple la condición. Y luego hay otra cosa que es que 77 00:06:45,160 --> 00:06:50,160 esta orden lo único que estaba haciendo era generar nuevas variables de tipo vector3 con 78 00:06:50,160 --> 00:06:57,080 estos nombres que tenemos aquí, ¿vale? Estos y les está dando una dirección matricial, es decir, 79 00:06:57,080 --> 00:07:05,320 en este caso un 1 0 0, aquí un 0 0 menos 1, ¿vale? Pero no estaba haciendo nada. Bueno, sí, estaba 80 00:07:05,320 --> 00:07:09,040 generando unas variables y había guardado un valor, pero no estaba haciendo que se moviera, 81 00:07:09,040 --> 00:07:14,120 que es lo que entiendo que pretendía. Recordad que para que se mueva lo que hay que cambiar no 82 00:07:14,120 --> 00:07:23,200 es generando un vector, es el transform, ¿vale? Habrá que darle un valor de movimiento, que es, 83 00:07:23,200 --> 00:07:30,560 por ejemplo, en la duda de la persona, pues aquí, por ejemplo, transform position, aquí estás 84 00:07:30,560 --> 00:07:36,360 cambiando la posición a la que ponga newPos, ¿vale? Aquí sí estamos afectando la posición. Si ponemos 85 00:07:36,360 --> 00:07:41,200 algo que es un tipo de variable y su nombre, estamos generando una variable, ¿vale? Esto ya 86 00:07:41,200 --> 00:07:50,840 lo hemos visto en otros momentos y entonces ya lo hemos visto. Si hay dudas, me paráis o me 87 00:07:50,840 --> 00:07:58,120 volvéis a escribir en base a esto. Luego veo también, y una cosa importante es que cuando 88 00:07:58,120 --> 00:08:03,040 tenemos la nave y este script de PlayerController en el contexto de la práctica de la nave, 89 00:08:03,040 --> 00:08:07,720 el script debería estar aplicado a la propia nave, en principio. Se puede hacer de más formas, ¿no? 90 00:08:07,720 --> 00:08:13,000 Entonces, lo que sí que he visto es que por Serialize se ha puesto un transform a otro objeto, 91 00:08:13,000 --> 00:08:27,320 ¿vale? Y cuando en la práctica uno instanciábamos y arrastrábamos, creábamos un empty, ¿vale? Y en 92 00:08:27,400 --> 00:08:31,560 ese poníamos el código y luego por código referenciábamos a un prefab, ahí sí estamos 93 00:08:31,560 --> 00:08:35,400 hablando de otro objeto que se tiene que instanciar. Pero si es la misma nave la que 94 00:08:35,400 --> 00:08:41,440 tiene el script, me parece raro, no digo por si acaso es ese el concepto, poner otro objeto. No, 95 00:08:41,440 --> 00:08:46,960 tú lo que vas a querer mover es la posición del objeto que lo tiene, ¿vale? Como, por ejemplo, 96 00:08:46,960 --> 00:08:51,880 pasará luego con los obstáculos. Ahora lo vemos, pero los obstáculos lo que hay que hacer es ponerle 97 00:08:51,880 --> 00:08:57,400 a cada obstáculo en su prefab, es la solución más obvia, un script que lo que haga es que se 98 00:08:57,400 --> 00:09:05,120 mueva continuamente hacia la pantalla, ¿vale? Por eso lo del otro objeto servirá cuando conectéis 99 00:09:05,120 --> 00:09:10,840 scripts. Si no habéis llegado a esto, ya en algún tema ya se habla de cómo conectar un script con 100 00:09:10,840 --> 00:09:17,720 otro. Iremos capturando coordenadas y posiciones de otros objetos, pero si el propio objeto es el 101 00:09:17,720 --> 00:09:26,920 que tiene el código, ese será el que el que defina el movimiento. Habrá que aludir al OtherObjectPosition, 102 00:09:26,920 --> 00:09:33,040 que a lo mejor hemos pasado el transform del mismo objeto que tiene el script, pero en el caso de 103 00:09:33,040 --> 00:09:38,240 querer moverse a sí mismo hay que hablar del TransformPosition, como ha hecho aquí. Aquí, 104 00:09:38,240 --> 00:09:46,080 lo que pongamos después, lo que va a hacer es mover a la nave, ¿vale? Y luego esto es mediante 105 00:09:46,240 --> 00:09:52,400 una asignación de algo, recordad que para trasladarse y rotar, aquí ahora mismo no ve el 106 00:09:52,400 --> 00:09:56,480 translate, por tanto no sé cómo se mueve, se está moviendo por el position, no está usando el 107 00:09:56,480 --> 00:10:02,600 translate. Transform.Translate es un método que permite hacer que se mueva, pero aludiendo al 108 00:10:02,600 --> 00:10:07,720 transform del objeto que tiene el script. Hasta aquí no sé si hay dudas, pero me parece importante 109 00:10:07,720 --> 00:10:13,560 esto que si alguna vez veis un if sin llaves, lo que se va a ejecutar en la primera instrucción, 110 00:10:13,760 --> 00:10:19,080 es como una forma simplificada, ¿vale? Y aquí este punto y coma en la condición sobra también, 111 00:10:19,080 --> 00:10:25,240 ¿vale? Aquí yo lo dejé, esto no es correcto. Después del condicional ya iría la llave o la 112 00:10:25,240 --> 00:10:33,120 instrucción directamente, nunca hay un punto y coma, al menos no de forma estándar. Vale, 113 00:10:33,120 --> 00:10:38,800 de aquí hay varias cosas que habría que ver el enfoque, ¿vale? Pero bueno. Luego, 114 00:10:38,800 --> 00:10:46,360 otra cosa importante es que, no sé, otra compañera me habló de que al hacer el input que no 115 00:10:46,360 --> 00:10:53,640 encontraba el GetKeyLeft o el GetKeyRight, no, el GetKeyDown o Up se refiere a si pulsamos o 116 00:10:53,640 --> 00:10:57,960 soltamos, esto lo pone en los apuntes y lo vimos también en otra tutoría, si no, por favor revisadla, 117 00:10:57,960 --> 00:11:04,800 se refiere al momento de bajar la tecla o el botón, subir la tecla, soltar el botón, ¿vale? Lo de 118 00:11:04,800 --> 00:11:09,560 Left y Right significa que alguien está entendiendo que esto lo que hace es que la nave se mueva hacia 119 00:11:09,560 --> 00:11:14,040 arriba o hacia abajo. No, esto significa al pulsar esta tecla y aquí tenemos que poner un Translate, 120 00:11:14,040 --> 00:11:20,040 pues si es hacia la derecha igual es un Right o un Forward, ¿vale? Pero no existe el GetKeyLeft 121 00:11:20,040 --> 00:11:26,880 directamente, va a decir, ah, si pulsas ahí va a la izquierda. No, ese método no existe, ¿vale? 122 00:11:27,400 --> 00:11:34,680 Luego había otra duda en el foro de otra compañera, ya os digo, di una respuesta ya, 123 00:11:34,680 --> 00:11:41,200 si la veis, pero bueno, quiero comentar alguna cosa. Cuando voy a enseñar un momento en el 124 00:11:41,200 --> 00:11:49,920 editor, por ejemplo, mi planteamiento de esta tarea, a ver, creo que no he cambiado nada, 125 00:11:50,440 --> 00:11:56,760 muy susceptible de cambiar, ¿vale? Pues yo cuando le doy a Play, ¿vale? Veis que lo que va apareciendo 126 00:11:56,760 --> 00:12:01,560 son clones de este Prefab que yo tengo aquí, que es el Obstacle, se llama así porque lo llama así, 127 00:12:01,560 --> 00:12:06,560 ¿vale? Se van generando y de vez en cuando desaparece, aparece otro y cada vez que hacemos 128 00:12:06,560 --> 00:12:12,800 un clon por instanciación pone un apellido al nombre de ese objeto que pone Clone, ¿vale? Lo 129 00:12:12,800 --> 00:12:18,920 digo porque en la incaptura de imagen, ¿vale? Por si alguna vez os volvéis a encontrar con algo así, 130 00:12:20,920 --> 00:12:28,400 ¿vale? Me dice, se me están copiando cientos de clones, de pronto, en vez de ir saliendo cuando 131 00:12:28,400 --> 00:12:32,680 quiero, salen. Fijaos que se está añadiendo la etiqueta de Clone muchas veces y eso significa 132 00:12:32,680 --> 00:12:39,720 que están creándose clones de ese Clone, es decir, se ha creado este Clone y luego a partir de éste 133 00:12:39,720 --> 00:12:46,400 se está haciendo más copia de ese Clone. ¿Por qué pasa esto? Si analizamos el código, está 134 00:12:46,400 --> 00:12:51,360 bastante bien enfocado, le falta algún detallito, pero bueno, que estos son los pasitos normales. 135 00:12:51,360 --> 00:12:57,120 Igual que hicimos en la primera práctica, estamos instanciando un Prefab, que es ese obstáculo, 136 00:12:57,120 --> 00:13:06,440 este pivote, ¿vale? Luego aludía también al obstáculo en sí dentro de este script, ¿vale? 137 00:13:06,440 --> 00:13:13,480 Así mismo, en realidad. ¿Por qué? Bueno, guardaba ese obstáculo, lo usaba para guardar la instancia 138 00:13:13,480 --> 00:13:21,120 dentro de una variable, ¿vale? Porque lo que hacía era crear estos obstáculos mediante 139 00:13:21,120 --> 00:13:26,640 una corrutina, ¿vale? Que decía, cuando llegue a tres copias, porque cada vez que se hace una copia 140 00:13:26,640 --> 00:13:33,120 se está guardando una instancia más, se está calculando más instancias, cuando cree tres copias deja 141 00:13:33,120 --> 00:13:38,640 de instanciar, ¿vale? Y esto tiene lógica cuando lo decimos en plan, yo no quiero que haya 142 00:13:38,640 --> 00:13:43,800 infinitos obstáculos, quiero en este caso que haya tres. Pero tened en cuenta que si creamos tres y se 143 00:13:43,800 --> 00:13:50,160 están moviendo, pues desaparecerán y ya no habrá más, ¿vale? O hay que seguir generando instancias, 144 00:13:50,160 --> 00:13:54,560 porque a medida que se van moviendo, si hay tres, luego en este código no hay ningún momento en el 145 00:13:54,560 --> 00:14:01,120 que reduzcamos este número, ¿vale? Entonces, echarle un ojo. Y algo importante, si ya vais 146 00:14:01,120 --> 00:14:06,120 usando para esta práctica, se podía hacer a lo mejor de otra forma, pero la lógica con lo que 147 00:14:06,120 --> 00:14:12,240 hemos visto es esta. Cuando empieza el juego, se empieza en el Start activando dos corrutinas, en 148 00:14:12,240 --> 00:14:17,480 este caso. Y este es uno de los problemas que hay, meter las dos corrutinas en un mismo script, ¿vale? 149 00:14:17,480 --> 00:14:24,120 Me explico. Al final, voy a, por ejemplo, a como lo tengo resuelto yo, que en realidad es algo muy 150 00:14:24,120 --> 00:14:30,840 parecido. Yo tengo este pivot estáculo, un nulo ya colocado en profundidad en Z, ¿vale? Porque luego lo 151 00:14:30,840 --> 00:14:35,080 que voy a variar, lo que ponen las instrucciones, es que pondremos un número aleatorio en el eje 152 00:14:35,240 --> 00:14:44,080 horizontal, para que siempre creándose en este 200, pues uno esté en el menos 20, otro en el 20, 153 00:14:44,080 --> 00:14:53,960 o en el 30, ¿vale? Se vaya aleatorizando, ¿vale? Entonces, importante, cuando activamos una corrutina, 154 00:14:53,960 --> 00:15:02,200 las corrutinas, por defecto, hay que tener cuidado de ponerlas en el Start, o ponerlas en un 155 00:15:02,200 --> 00:15:07,240 momento que sólo se active una vez. ¿Por qué? Porque si esta corrutina la empezamos en el Update, 156 00:15:07,240 --> 00:15:12,720 es decir, cada fotograma, cada fotograma empezará a ejecutarse, ¿vale? No es lo que ha pasado aquí, 157 00:15:12,720 --> 00:15:17,840 pero ojo, eso es importante. Que si ponemos en el Update que se genera una corrutina, que sea 158 00:15:17,840 --> 00:15:22,960 porque hay una condición que se lanza a veces, o una vez sólo. Porque si no, estaríamos cada 159 00:15:22,960 --> 00:15:28,200 fotograma en el Update, llamando a esta corrutina que haría estas instrucciones en paralelo. Las 160 00:15:28,200 --> 00:15:35,040 corrutinas se llaman así porque a la rutina, a lo que está ocurriendo, digamos, mientras estamos 161 00:15:35,040 --> 00:15:40,760 ejecutando el juego, en paralelo se abre otro proceso que podemos ponerle otro código, ¿vale? 162 00:15:40,760 --> 00:15:45,520 Otras instrucciones, con este enumerator, que es una orden de interfaz, ¿vale? Bueno, eso da un poco 163 00:15:45,520 --> 00:15:53,760 igual. Tened cuidado de controlar cuántas veces lancéis las corrutinas. Además, si fuéramos lanzando 164 00:15:53,760 --> 00:15:59,120 la corrutina muchas veces, al abrirse tantos procesos en paralelo y no cerrarlo nunca, si no 165 00:15:59,120 --> 00:16:03,440 ponemos un StopCorroutine, como pasaría aquí, el juego en algún momento empezará a ir lento, a 166 00:16:03,440 --> 00:16:10,600 crasear, etcétera, ¿vale? Porque cada vez iremos llevando más recursos. Entonces, aquí lo que ha 167 00:16:10,600 --> 00:16:18,920 pasado es que este script, yo entiendo, este script que crea obstáculos, ¿vale? A lo mejor sí que creaba 168 00:16:18,920 --> 00:16:25,440 solo tres, pero si estaba puesto en cada obstáculo, es decir, dentro del prefab, ¿vale? Porque recordad 169 00:16:25,440 --> 00:16:30,400 que un propio prefab, igual que yo he puesto aquí, que el prefab en sí siempre se mueva, que es lo 170 00:16:30,400 --> 00:16:37,560 que hace este script, hacia la pantalla, ¿vale? Si le ponemos que cada vez que instanciamos un objeto, 171 00:16:37,560 --> 00:16:44,600 tenga dentro, en este caso un obstáculo, tenga dentro un script que también dice, oye, cada copia, 172 00:16:45,040 --> 00:16:48,960 cada copia al lanzarse, y es un poco lo mismo que os decía de tener cuidado al lanzar corrutinas, 173 00:16:48,960 --> 00:16:55,000 a ver que no... que estábamos aquí, ¿vale? Si esto lo ponemos a cada uno de los obstáculos, cuando se 174 00:16:55,000 --> 00:16:59,880 lanza el obstáculo, cada obstáculo va a tener hasta tres instancias, porque las estamos aquí lanzando. 175 00:16:59,880 --> 00:17:07,800 Entonces, ¿cuál es la solución? En vez de que haya infinitos scripts lanzando copias, 176 00:17:07,800 --> 00:17:13,320 solo habrá que ponerlo en uno, ¿vale? Igual que hacíamos en la práctica 1. He puesto aquí un 177 00:17:13,640 --> 00:17:23,520 AntiObject, que este, abro el código, bueno, un AntiObject, y abro el código que tengo yo, 178 00:17:23,520 --> 00:17:28,800 por ejemplo, ¿vale? Que lo que hace, y se parece mucho a lo que ha hecho la compañera, ¿vale? Con 179 00:17:28,800 --> 00:17:34,840 un intervalo de tiempo, que bueno, aquí está generado para que relacione la velocidad con la 180 00:17:34,840 --> 00:17:39,120 distancia a la rapidez, pero podéis poner un número rápidamente, ¿vale? Pues se lanza una corrutina en 181 00:17:39,120 --> 00:17:45,680 el Start, igual que ha hecho la compañera, y en todo momento haya un bucle que cada cierto tiempo 182 00:17:45,680 --> 00:17:49,640 que marcamos con este intervalo, o podemos poner un 2 si queremos que sea siempre dos segundos, 183 00:17:49,640 --> 00:18:00,000 ¿vale? Pues se vaya lanzando una instancia desde ese punto que habíamos puesto, que fijaos que yo, 184 00:18:00,000 --> 00:18:05,840 el instanciador, ese objeto que lanzará este obstáculo, que sí que hemos pasado, igual que 185 00:18:05,840 --> 00:18:12,200 la tarea 1, por un SerializeField, ¿vale? Siempre le estamos diciendo, ¿vale? La instanciación que se 186 00:18:12,200 --> 00:18:19,680 haga desde el punto Impose, que yo he creado anteriormente, que tendrá ya las posiciones de 187 00:18:19,680 --> 00:18:27,160 Z e Y, que yo ya he marcado en esta posición, las marco yo con el gizmo, vamos, con las coordenadas 188 00:18:27,160 --> 00:18:33,200 del instanciador, ¿vale? Y luego, aparte la X, que sea un número aleatorio, en este caso entre 189 00:18:33,200 --> 00:18:40,600 menos 40 y 40, ¿vale? Y entonces lanzará ese obstáculo en estas coordenadas y hará una vuelta, ¿vale? 190 00:18:40,600 --> 00:18:45,960 Porque el While True es un bucle infinito, ¿vale? Si este bucle infinito no lo pusiéramos en una corrutina, 191 00:18:45,960 --> 00:18:51,720 una corrutina que dijéramos un intervalo de tiempo, en un solo fotograma inmediatamente entraría en 192 00:18:51,720 --> 00:18:56,160 conflicto, porque sería un bucle, que esto se hablaba en el tema cero, que no se cierra, que no está 193 00:18:56,160 --> 00:19:02,320 controlado, entonces se sobrecarga y se va lejos. Por eso, en las corrutinas es súper frecuente poner 194 00:19:02,320 --> 00:19:07,800 bucles que diga, vale, ejecuto aquí, bajo, bajo, bajo, se va ejecutando, hago la instancia y cuando 195 00:19:07,800 --> 00:19:13,640 llego aquí, paro hasta que pase dos segundos, o lo que pongamos aquí. ¿Han pasado segundos? 196 00:19:13,640 --> 00:19:19,520 Vuelvo al bucle y otra vez. Si yo no pusiera esta orden y consiguiera decir, si me metiera un bucle sin 197 00:19:19,520 --> 00:19:27,240 una pausa en medio, ¿vale? Esto se ejecutaría constantemente. Hay otra orden que es, en vez de 198 00:19:27,240 --> 00:19:34,000 poner, por ejemplo, el waitForSeconds, que le decimos un tiempo, si le decimos yieldReturn 199 00:19:34,000 --> 00:19:39,680 null, a una orden dentro de una corrutina, en este momento lo que hace es parar aquí la ejecución y 200 00:19:39,680 --> 00:19:45,560 esperar al siguiente fotograma. Es un poco como hacerlo del update, va por fotogramas. Esto es 201 00:19:45,560 --> 00:19:53,880 importante. Entonces, lo que se ha hecho aquí es este instanciador, igual que la compañera tenía 202 00:19:53,960 --> 00:20:00,120 en un solo script las dos corrutinas, una de crear obstáculo y otra de moverlo en el mismo, 203 00:20:00,120 --> 00:20:06,760 claro, si ponemos también el mover, si mezcláramos también, hiciéramos la operación inversa en este 204 00:20:06,760 --> 00:20:14,200 script que os estaba enseñando, aquí está, también me va a poner la corrutina mover. Claro, 205 00:20:14,200 --> 00:20:18,360 tened en cuenta que es el instanciador el que se movería. Si el instanciador es el que da las 206 00:20:18,360 --> 00:20:22,480 coordenadas de X e Y, se iría moviendo hacia la cámara. Si le pusiéramos que se fuera moviendo 207 00:20:22,640 --> 00:20:28,320 en Z hacia la cámara y se irían haciendo copias, en ese punto, por tanto, saldría de cámara, 208 00:20:28,320 --> 00:20:34,440 se iría haciendo copias y ya no lo veríamos. No sé si me explico. Entonces, recordad que se 209 00:20:34,440 --> 00:20:38,600 pueden aplicar, incluso a un mismo GameObject, se pueden aplicar diferentes scripts y se van 210 00:20:38,600 --> 00:20:44,960 sumando las cosas que hacen. Entonces, la operación más lógica sería que en el propio prefab, 211 00:20:45,960 --> 00:20:54,160 en este obstáculo, vais a ver que ya dentro del prefab hay un script que cada copia, 212 00:20:54,160 --> 00:21:00,440 cada instancia del script, va a tener ya este movimiento por efecto. No cada script va a 213 00:21:00,440 --> 00:21:05,360 instanciar copias porque entonces pasa el problema que he comentado antes. Pero si yo me meto aquí en 214 00:21:05,360 --> 00:21:12,800 el código, os voy a enseñar este, por ejemplo, este es el que hace una variable de velocidad y 215 00:21:12,800 --> 00:21:18,480 en el Update es donde decimos, vale, esto es un back a esta velocidad y recordad que el Update, 216 00:21:18,480 --> 00:21:24,680 además, cuando haya movimientos o rotaciones dentro del Update, que ahora veremos algo más 217 00:21:24,680 --> 00:21:31,000 sobre esto en el tema 3, lo suyo es multiplicarlo por el TimeDeltaTime. Solo una vez, no muchas 218 00:21:31,000 --> 00:21:36,800 veces vamos a usar este movimiento y como que lo vamos variando. Ya os comenté que básicamente lo 219 00:21:36,800 --> 00:21:42,560 que hace esto es devolver el tiempo que hay entre fotograma y fotograma, que varía según la potencia 220 00:21:42,560 --> 00:21:47,640 del ordenador. Sirve para equilibrar que en todos los dispositivos se vea igual, se mueva igual el 221 00:21:47,640 --> 00:21:53,800 objeto. Si tenemos una máquina que procesa mucho, si no ponemos algo de este tipo, pues se 222 00:21:53,800 --> 00:22:00,200 movería más rápido la nave porque cada fotograma para él se ejecuta con menor lapso de tiempo. La 223 00:22:00,200 --> 00:22:08,000 contraindicación que tiene este TimeDeltaTime es que devuelve números tipo 0,2, 0,3, yo que sé, 224 00:22:08,560 --> 00:22:13,440 son números muy pequeños. Entonces, cuando lo multiplicamos, si hemos estado probando esto sin 225 00:22:13,440 --> 00:22:20,920 poner esto y luego lo ponemos, se va a multiplicar y se va a desacelerar mucho. Es normal porque está 226 00:22:20,920 --> 00:22:26,440 aplicando un valor pequeño para equilibrar, pero pequeño. Entonces, siempre esta variable que 227 00:22:26,440 --> 00:22:31,640 ponemos, a lo mejor hay que incrementarla, no hay problema. Si esto me lo ha dividido entre 100, 228 00:22:32,320 --> 00:22:38,360 si esto estuviera sin aplicarlo está a 30, pues igual hay que ponerlo a 3000. No pasa nada, esto 229 00:22:38,360 --> 00:22:46,160 lo controlamos nosotros. Y luego, importante, si yo no... y de hecho lo voy a hacer la prueba. Si yo 230 00:22:46,160 --> 00:22:50,760 comento esto, aquí estoy consiguiendo que el Translate se mueva hacia el Back, es decir, 231 00:22:50,760 --> 00:22:55,640 hacia el Z negativo, hacia la cámara, en este caso, si está bien orientado todo, a una cierta velocidad, 232 00:22:56,000 --> 00:23:04,720 cada objeto que se está instanciando en el punto de instanciador. Voy a guardar y ahora mismo tengo 233 00:23:04,720 --> 00:23:13,640 el juego. Me vuelvo, salgo y juego. Se empieza a ejecutar el juego, se van haciendo las copias 234 00:23:13,640 --> 00:23:18,560 cada dos segundos poner, por eso es regular, y el intervalo también se podría poner un random range, 235 00:23:18,560 --> 00:23:23,600 un número aleatorio, para que no siempre se instancien con el mismo periodo de tiempo. Pero 236 00:23:23,600 --> 00:23:28,720 veis que van pasando los clones y aquí, si dejo este juego ejecutándose mucho tiempo, se irán 237 00:23:28,720 --> 00:23:32,760 acumulando, acumulando, acumulando, y si me muevo en el editor, básicamente, porque esto es un 238 00:23:32,760 --> 00:23:37,960 ejército de obstáculos hasta el infinito. ¿Qué pasa? Que si se van acumulando todos estos clones, 239 00:23:37,960 --> 00:23:44,360 estos clones, llegan a un punto que habrá tanto objeto aquí que va a colapsar o va a ralentizarse. 240 00:23:44,360 --> 00:23:51,520 Por tanto, como a nosotros sólo nos interesa el tiempo en el que los obstáculos están viéndose 241 00:23:51,680 --> 00:23:56,320 en el juego, porque en este juego no vamos a girar y vamos a ver lo que hay detrás, todo lo que pase 242 00:23:56,320 --> 00:24:01,120 de detrás de la cámara, que sería un poco a partir de aquí, todo esto que está ocurriendo aquí, 243 00:24:01,120 --> 00:24:05,920 ya nos da igual que ocurra. De hecho, preferimos que no ocurra para que no se sigan aquí sumando 244 00:24:05,920 --> 00:24:15,840 clones. Para eso está la orden de el destroy. ¿Cuál ha sido el plantamiento? Lo vuelvo a activar. 245 00:24:16,680 --> 00:24:22,720 Ahí está, lo dejo de comentar. Si, como el script lo lleva al propio obstáculo, el transformer alude 246 00:24:22,720 --> 00:24:29,080 a las coordenadas del obstáculo. Decimos, si la Z es menor a menos 10, es decir, si la Z, 247 00:24:30,160 --> 00:24:34,320 por ejemplo, pongo la nave y la voy moviendo para atrás, es menor de menos 10, es decir, cuando pase 248 00:24:34,320 --> 00:24:39,920 detrás de la nave y de la cámara, cuando pase detrás de este punto, lo que voy a hacer es destruir 249 00:24:39,920 --> 00:24:45,120 el GameObject. Si ponemos aquí GameObject, se destruye a sí mismo, es decir, destruye al objeto 250 00:24:45,120 --> 00:24:50,080 que tiene el código. El destroy, si veis la documentación, puede destruir otros objetos, 251 00:24:50,080 --> 00:24:54,600 si los referenciamos de cierta forma. Pero si queremos destruir al propio objeto que tiene 252 00:24:54,600 --> 00:25:01,000 el código, esta sería la orden. Una vez alcancen, como se está moviendo y está el Update refrescando, 253 00:25:01,000 --> 00:25:06,360 cuando el Translate haga que se sobrepase esta coordenada, pues destruyelo, que ya no lo quiero 254 00:25:06,360 --> 00:25:17,960 el objeto. Y vais a ver, a ver si he guardado, que se empiezan generando igual, pero cuando los 255 00:25:17,960 --> 00:25:23,680 pivotetes superan en cierta posición que habíamos marcado, se destruyen y por eso dejan de verse. 256 00:25:25,120 --> 00:25:34,160 ¿Qué tal hasta aquí? Ahora lo veremos también, pero a veces la clave de las soluciones es segmentar 257 00:25:34,200 --> 00:25:40,640 los códigos, es decir, hacerlos menos pequeños. Por ejemplo, aquí la compañera está muy bien 258 00:25:40,640 --> 00:25:46,400 enfocado. Es obvio lo que quería hacer con esto de limitar el número de instancias, pero el problema 259 00:25:46,400 --> 00:25:51,080 está en limitar a tres instancias, pero ¿en qué momento puedo hacer más de tres? Porque si no, 260 00:25:51,080 --> 00:25:57,400 a los tres pivotes ya no se puede seguir. Por cierto, la compañera puso aquí una orden, 261 00:25:57,400 --> 00:26:03,920 FOR y estos puntos y comas, que es lo mismo que poner el While True. Significa que se hace un 262 00:26:03,920 --> 00:26:10,440 bucle infinito y, como veréis, lo ha hecho muy bien porque luego, para parar la corrutina cada 263 00:26:10,440 --> 00:26:15,800 cierto tiempo, ha puesto esta orden de NULL que es que, oye, espérate un fotograma para ir moviendo 264 00:26:15,800 --> 00:26:21,640 el obstáculo. Pues tiene sentido porque el Translate, al final, nosotros lo vamos viendo 265 00:26:21,720 --> 00:26:27,760 en cada fotograma, entonces está bien ejecutado. Se podría poner también directamente, 266 00:26:29,880 --> 00:26:38,240 con el While True, por ejemplo, o con un intervalo. En realidad, en mover obstáculos no es necesaria 267 00:26:38,240 --> 00:26:44,560 una corrutina porque se puede hacer, como he puesto, con un Translate en el propio objeto que lleva 268 00:26:44,560 --> 00:26:50,720 el script. Entonces no hace falta usar una corrutina que devuelve en cada fotograma porque ya podemos 269 00:26:50,800 --> 00:26:57,280 usar el Update. Como hemos hecho aquí para moverlo, pues en el propio Update es un poco lo mismo que 270 00:26:57,280 --> 00:27:04,000 abrir la corrutina en este caso. Y ojo que aquí, por ejemplo, faltaría probablemente el TimeDeltaTime. 271 00:27:06,000 --> 00:27:15,760 En cuanto a esto, no sé si hay alguna duda, si se entiende un poco lo que he visto. Si me podéis 272 00:27:15,760 --> 00:27:21,240 decir que os estoy viendo en el chat o si me podéis contestar. ¿Hasta aquí qué tal? Entiendo que con 273 00:27:21,240 --> 00:27:29,960 esto, más o menos, ya las dudas de la tarea están resueltas. Más o menos, claro. Vale, perfecto. 274 00:27:30,960 --> 00:27:39,640 Pues esto, por un lado, creo que no hay nada más así nuevo. Por supuesto, todo se puede 275 00:27:39,640 --> 00:27:49,320 variar mucho, pero más o menos con esto. Ya os hablé también de que los límites se pueden 276 00:27:49,320 --> 00:27:57,400 también mostrar, por ejemplo, en PlayerController. Os enseño mi código, que es un código 277 00:27:57,400 --> 00:28:06,800 que es bastante más complejo. Cuando empiezas... Ah, no, este no es. Este era otro que tenemos por aquí. 278 00:28:09,640 --> 00:28:21,960 PlayerController. Bueno, capturamos las posiciones. Cosas importantes también, todo 279 00:28:21,960 --> 00:28:28,320 lo que sea, y esto también ya sirve de adelanto para la 3, todo lo que sea coger inputs, como 280 00:28:28,320 --> 00:28:38,000 por ejemplo aquí, que son tres inputs independientes para coger los ejes con dos teclas que unan 281 00:28:38,080 --> 00:28:42,560 el negativo y el positivo, como ya vimos. Otro eje para el vertical, otro eje para hacer la rotación. 282 00:28:42,560 --> 00:28:48,920 Lo suyo es ponerlo siempre en el Update, dentro del Update. ¿Por qué? Porque el Update al final 283 00:28:48,920 --> 00:28:53,920 es la unidad de tiempo más rápida para capturar, porque según la velocidad de procesamiento, como 284 00:28:53,920 --> 00:28:59,240 ya hemos dicho del ordenador, en cada fotograma capturará lo que estamos haciendo. Lo digo 285 00:28:59,240 --> 00:29:05,320 porque veréis en el tema 3 que también habla de los FixedUpdate. Cuando vayáis a usar físicas, 286 00:29:05,320 --> 00:29:13,640 ahora lo vemos, ahí sí que deberíamos usar los movimientos de AddRotate, AddTorque, AddForce, 287 00:29:13,640 --> 00:29:20,800 en otro método que se llama FixedUpdate. Eso lo vemos ahora. Lo que quería deciros es que aquí 288 00:29:20,800 --> 00:29:25,960 en el Update, en cada fotograma, se hizo un método, esto lo dije el otro día, lo empecé a hacer, 289 00:29:25,960 --> 00:29:33,960 que había un montón de condiciones sobre los movimientos. Si esto llega a un punto, se convierte 290 00:29:33,960 --> 00:29:39,200 una booleana en falso y ya condiciona que no se pueda hacer, porque recordad que las booleanas 291 00:29:39,200 --> 00:29:47,000 sirven muchas veces para marcar que se cumpla la condición o no, que todo se puede ir agrupando 292 00:29:47,000 --> 00:29:52,800 en métodos. Y esto es útil, por ejemplo, para lo que he dicho antes de la compañera, ir diciendo 293 00:29:52,800 --> 00:30:02,400 voy a hacer un método que lo que sirva sea para chequear los límites. 294 00:30:02,760 --> 00:30:07,440 Para tener claro el bloque en el que estás trabajando, yo lo referencia en el momento que 295 00:30:07,440 --> 00:30:11,880 quiera y luego me voy a otra parte del código en la que voy trabajando en eso y luego es más fácil 296 00:30:11,880 --> 00:30:16,520 encontrar dónde está todo que ponerlo todo en un Update. Esto ya lo hemos hablado alguna vez más, 297 00:30:16,520 --> 00:30:25,760 pero es importante verlo. Si no hay nada más así que yo caiga, vamos a ir con la unidad 3, 298 00:30:25,760 --> 00:30:29,520 que además había un compañero que tenía dudas sobre ello. Vamos allá. 299 00:30:31,320 --> 00:30:37,800 Pues si quieres, coméntame qué dudas tenías para ponernos con la 3. 300 00:30:42,520 --> 00:30:46,240 Yo creo que si me estás hablando no te digo porque te tendrás que dar al micrófono, 301 00:30:46,240 --> 00:30:47,520 que no lo sé si estás hablando. 302 00:30:47,520 --> 00:30:57,840 Me indica que era solo un poco aclarar cómo hacerlo. Lo primero que voy a hacer, 303 00:30:57,840 --> 00:31:02,880 también para que tengáis en contexto lo que se pide, a nivel de más o menos cómo tiene que 304 00:31:02,880 --> 00:31:10,280 acabar, consiste en un juego en el que hay una bola que de distintas formas tiene que 305 00:31:10,280 --> 00:31:16,320 llegar a un agujero y meterse y entonces se pasa de nivel. Voy a hacer un poco de gameplay para 306 00:31:16,320 --> 00:31:24,880 que veáis qué es lo que hay que conseguir. Yo tengo por un lado esta bola, que en el primer 307 00:31:24,880 --> 00:31:30,520 nivel, por ejemplo, se moverá la bola, se impulsará ella misma hacia adelante, hacia detrás, con una 308 00:31:30,520 --> 00:31:36,800 cruceta que he creado. Yo en mi caso el WASD, pero ya sabéis que con el Input Manager podéis definir 309 00:31:36,800 --> 00:31:44,280 que si la bola se cae, se reinicia el nivel. Yo me caigo y pierdo. Este nivel es realmente sencillo 310 00:31:44,280 --> 00:31:51,640 porque lo que hay que hacer es ir a ese agujero que hay allí. Cuando consigo ir al agujero, 311 00:31:51,640 --> 00:31:56,960 lo que hace es que me cambia a otro nivel, que es otra escena que tengo aquí. Ahora ha pasado al 312 00:31:56,960 --> 00:32:03,240 nivel 2. Ahora, en esta escena, si yo doy a la cruceta de la bola... Bueno, lo he configurado 313 00:32:03,240 --> 00:32:07,560 así. Esto, por supuesto, por código nosotros diremos lo que sea, pero la cruceta de la bola 314 00:32:07,560 --> 00:32:12,920 ya no se mueve. En este nivel tengo otra cruceta, que en este caso son las flechas del teclado, 315 00:32:13,080 --> 00:32:20,720 que lo que hace es añadir un torque, una rotación por física, al tablero y entonces la bola se mueve 316 00:32:20,720 --> 00:32:28,680 por la gravedad, según cuánto inclinemos. Efectivamente, en el nivel 2 se mueve esta base, 317 00:32:28,680 --> 00:32:33,800 entonces el juego se complica porque hay que ir calculando un poco la trayectoria según la fuerza 318 00:32:33,800 --> 00:32:41,760 de la bola. En las dos, si en la primera lo que se movía era la bola, con un Add Force para darle 319 00:32:41,760 --> 00:32:46,560 empuje a la posición de la bola, en este la bola se mueve por el Rigid Body, por la gravedad, 320 00:32:46,560 --> 00:32:56,560 pero en realidad lo que estamos usando es un Add Torque para hacer oscilar esta plataforma e ir 321 00:32:56,560 --> 00:33:02,680 llevando la bola hacia el agujero. Y cuando llego, paso a un tercer nivel. Y el tercer nivel, que es 322 00:33:02,680 --> 00:33:08,280 otra escena que tenemos aquí, es lo mismo. Podéis hasta usar la misma plataforma a la que le hemos 323 00:33:08,360 --> 00:33:13,480 añadido unos bloques que sirven, como tienen colliders, para detener el movimiento de la 324 00:33:13,480 --> 00:33:20,120 bola. Entonces, lo mismo, si yo me caigo porque la bola se cae, se reinicia ese nivel. En el anterior 325 00:33:20,120 --> 00:33:26,400 pasaba lo mismo. Vale, me caigo porque no calcula bien, lo hago así un poco mal. Vale, importante, 326 00:33:26,400 --> 00:33:32,560 una cosa un poco chorra, pero cuando estéis testeando, esto creo que ya lo he explicado 327 00:33:32,560 --> 00:33:39,920 alguna vez, cuando estéis testeando en la sección Game se ejecutará todo como el juego real, es decir, 328 00:33:39,920 --> 00:33:45,400 con los controles y las teclas y todo que hayamos configurado para jugar. Es una simulación del 329 00:33:45,400 --> 00:33:51,800 juego. Pero nosotros podemos ir en paralelo a la ventana escena e incluso ir testeando cosas, 330 00:33:51,800 --> 00:33:56,520 en plan, quiero ver, solo que para seleccionar tenemos que estar en este panel, quiero ver cómo 331 00:33:56,520 --> 00:34:03,240 la bola actúa, la gravedad en ella. Si yo la echo para arriba y suelto, me lo simula. Abajo se ve 332 00:34:03,240 --> 00:34:07,720 que se mueve porque la cámara está siguiendo la pelota, por eso está. Y si yo, por ejemplo, 333 00:34:07,720 --> 00:34:12,960 quiero hacer una prueba rápida de qué pasa al llegar al agujero, si cada vez que queremos hacerlo 334 00:34:12,960 --> 00:34:16,680 me tengo que pasar el nivel, que a lo mejor no, podemos coger aquí y arrastrarlo al agujero 335 00:34:16,680 --> 00:34:22,880 directamente. Y aquí ha pasado un cuarto nivel. Este cuarto nivel es como opcional, no está 336 00:34:22,880 --> 00:34:30,960 planteado. Lo tengo yo aquí previsto, que es igual que los otros, que si alguno llega a hacer 337 00:34:30,960 --> 00:34:35,240 todos los niveles y quiere complicarse, se lo planteo. Es una especie de pinball que es igual 338 00:34:35,240 --> 00:34:43,800 que el otro, pero que cuando toca estos pivotines, le añade una fuerza en la dirección que vaya, 339 00:34:43,800 --> 00:34:51,880 coge una normal, es más complejo, y le empuja, la repele un poco. Veis que le da un poquito de... 340 00:34:51,880 --> 00:34:56,880 Entonces con esto digamos que se puede generar como un pinball. Ahí le da, veis que le da como 341 00:34:56,880 --> 00:35:03,760 un empuje según la orientación que tenga. Este nivel no tenéis que hacerlo para la práctica. 342 00:35:03,760 --> 00:35:08,360 Sí que tiene una cosa importante, que lo podéis hacer ya en el nivel 3, que es el último que 343 00:35:08,360 --> 00:35:13,160 tenéis que hacer, que cuando llega la bola aquí, lo que hace es reiniciarse el juego, volver al nivel 1. 344 00:35:13,160 --> 00:35:20,320 Esta lógica podríamos ir haciendo niveles y niveles y niveles, que vamos enlazando escenas 345 00:35:20,840 --> 00:35:28,560 y tendríamos un juego que podría durar un millón de niveles, según la lógica que podemos ir haciendo. 346 00:35:28,560 --> 00:35:37,680 Hasta aquí solo ha sido el planteamiento. Si leéis bien nuevamente la tarea, se aprende mucho 347 00:35:37,680 --> 00:35:43,240 la tarea también a ver cómo está desglosado. Son muchas cosas, a veces está organizada y tal, 348 00:35:43,240 --> 00:35:47,760 pero bueno, se ponen pistas de cómo hacerlo, a veces se da un nuevo método, que por cierto, 349 00:35:47,760 --> 00:35:53,440 las tareas, aunque son voluntarias, los enunciados, lo que se incluye en el planteamiento, también es 350 00:35:53,440 --> 00:35:58,800 objeto de examen. Le digo para que también lo consideréis, que aunque no las ejecutéis, si ahí 351 00:35:58,800 --> 00:36:07,280 se explica qué hace el Destroy, pues el Destroy también se ha visto. Entonces, dudas así que te 352 00:36:07,280 --> 00:36:13,920 surjan. Daniel, que te veo por aquí. ¿Dudas que te surjan? ¿Has intentado empezar con ella? 353 00:36:14,640 --> 00:36:15,760 De momento, no. 354 00:36:32,120 --> 00:36:38,840 Yo no sé si me escuchas. Si me estás hablando, no tienes el micrófono. Le he echado un vistazo. 355 00:36:39,400 --> 00:36:47,320 Está como en el momento... solo el tema del movimiento. Voy a hacer los primeros pasos de 356 00:36:47,320 --> 00:36:53,080 la práctica, si no hay ninguna duda concreta. Y importante, aquí ya tenemos que ir pensando en 357 00:36:53,080 --> 00:36:58,760 los distintos componentes, que hasta ahora tampoco había muchos, más allá de los scripts y el 358 00:36:58,760 --> 00:37:05,040 transform, por supuesto, que son los colisionadores. Esto viene en el tema explicado, por eso, a no ser 359 00:37:05,040 --> 00:37:11,360 que tengáis dudas concretas. Ya no me voy a detener mucho hoy, pero tenemos que ir teniendo en 360 00:37:11,360 --> 00:37:16,240 cuenta que todo, para que un objeto pueda chocar con otro, tiene que tener un colisionador. Y para 361 00:37:16,240 --> 00:37:20,640 que se le apliquen las leyes de la gravedad, como a esta bola, que yo lanzo el juego y va hacia abajo 362 00:37:20,640 --> 00:37:28,080 hasta que algo lo detiene, eso significará que la bola tiene un Rigid Body. Si no, no hay fuerza 363 00:37:28,080 --> 00:37:35,240 de la gravedad. Aparte de un Collider, por supuesto, que marca los límites. Y ojo, que yo le ponga a un 364 00:37:35,240 --> 00:37:45,960 objeto un Collider, luego lo puedo ajustar. Yo le puedo decir que el radio es bastante más grande. 365 00:37:45,960 --> 00:37:50,120 Y aunque la bola parezca que solo llega hasta ahí, veréis que yo cuando lanzo el juego 366 00:37:50,120 --> 00:37:59,320 se va a quedar... o se debería quedar como flotando y de hecho está flotando un poco. 367 00:37:59,320 --> 00:38:04,640 No se ve mucho. Veis que no, es por la perspectiva de la cámara. Pero veis que la bola se está 368 00:38:04,640 --> 00:38:09,760 quedando estancada donde yo he marcado ese Collider. A nivel físico, los Colliders son los 369 00:38:09,760 --> 00:38:16,040 que mandan. Que no os engañe las apariencias del Mesh Renderer, que es el renderizador de la 370 00:38:16,040 --> 00:38:26,560 apariencia. Aquí es donde se marcan las dimensiones. Después de este inciso, en la práctica os dejé... 371 00:38:26,560 --> 00:38:33,960 En el aula virtual tenéis un ítem al lado del enunciado de la tarea que tiene tres FBX. 372 00:38:33,960 --> 00:38:40,840 Primeros datos importantes. Esto lo pone en el enunciado más o menos claro, pero cuando 373 00:38:40,840 --> 00:38:50,360 incorporamos un FBX, yo ya los tengo aquí metidos, pero un FBX para incorporarlo se arrastra 374 00:38:50,360 --> 00:38:54,840 a la sección que queramos dentro del proyecto para que se incorpore un Asset y se importa. 375 00:38:54,840 --> 00:39:00,600 Cuando lo importamos, cuando seleccionamos un objeto, y esto por ejemplo va a ser también muy 376 00:39:00,600 --> 00:39:06,480 importante cuando vayamos a trabajar en animaciones de geometrías 3D, en plan un personaje que se mueve, 377 00:39:06,480 --> 00:39:14,760 o también en animaciones de objetos 2D cuando metamos Sprites en la unidad 5, cada Asset que 378 00:39:14,760 --> 00:39:19,400 vayamos metiendo, en este caso FBX, pero igual en el futuro un PNG o una secuencia de PNGs, 379 00:39:19,400 --> 00:39:26,680 cuando clicamos en el inspector salen opciones de ese tipo de Asset. Entonces mirad, por ejemplo, 380 00:39:26,680 --> 00:39:31,360 cuando yo cojo una geometría, un 3D, aparte de que aquí se ve una miniatura también que podemos 381 00:39:31,680 --> 00:39:38,080 movernos, si no se ve que esto está muy recogido, aquí se nos muestra la previa de qué es esto que 382 00:39:38,080 --> 00:39:47,840 tenemos aquí. En este caso es una geometría de la pieza del suelo con este agujero y habrá 383 00:39:47,840 --> 00:39:55,120 cuatro secciones que ya meteremos en ella, pero de primeras en modelo hay dos elementos bastante 384 00:39:55,120 --> 00:40:02,520 importantes, que por defecto nos ponen una escala de 1, y hay una conversión de unidades de 1 385 00:40:02,520 --> 00:40:09,360 centímetro a 0,01 metros en Unity. Hay una cosa, y esto puede pasar también al cambiar entre varios 386 00:40:09,360 --> 00:40:15,320 softwares, que es que si traéis un objeto de ciertos softwares, ahora mismo no puedo decir 387 00:40:15,320 --> 00:40:21,440 tampoco en Maya, no me acuerdo, hay softwares que trabajan en centímetros y otros como Unity 388 00:40:21,440 --> 00:40:28,520 que trabajan en metros. Entonces lo que en un software un 1 es un centímetro, en otro es un 0,01. 389 00:40:28,520 --> 00:40:37,840 Entonces esto, si ya nos acostumbramos a cierto flujo de trabajo, que intercambiamos modelos entre 390 00:40:37,840 --> 00:40:43,320 softwares, pues siempre será igual porque es testearlo. Si no lo tenemos muy claro, cuando metamos la primera 391 00:40:43,320 --> 00:40:47,760 geometría, por ejemplo, esta es la que acabo de arrastrar, que no he hecho ningún cambio aquí, 392 00:40:48,240 --> 00:40:54,320 si yo, por ejemplo, arrastro este objeto, fijaos que yo no sé cuánto tiene que ocupar quizá, 393 00:40:54,320 --> 00:41:01,480 pero lo primero es, cuando arrastramos un objeto, atención con ver si las coordenadas que nos pone, 394 00:41:01,480 --> 00:41:06,160 porque lo coloca siempre en el centro donde tenemos el viewer, si son el 0,0 o donde queremos. 395 00:41:06,160 --> 00:41:10,280 Ahora mismo igual lo vemos muy pequeño porque está súper abajo y por perspectiva parece que 396 00:41:10,280 --> 00:41:15,240 es muy pequeño. Con estos tres puntitos lo podemos resetear, que esto creo que ya lo hemos visto. 397 00:41:15,440 --> 00:41:18,240 Fijaos que yo tengo aquí un objeto y ahora sí que no hay 398 00:41:21,560 --> 00:41:28,240 confusión de que esté lejos, que yo lo veo muy pequeño o no. Es decir, tener en cuenta que ya 399 00:41:28,240 --> 00:41:34,440 hablamos que cada cuadradico del grid que tenemos aquí en el suelo, vamos, en el eje que queramos, 400 00:41:34,440 --> 00:41:41,800 que el grid lo podemos cambiar aquí de orientación también, y se activa con este botón que hay aquí. 401 00:41:41,800 --> 00:41:48,600 Normalmente queremos que sea la representación del suelo. Fijaos que este madero solo mide un 402 00:41:48,600 --> 00:41:55,160 metro. A lo mejor queréis que todo sea una escala de un metro, pero es un tablero pequeñito. A ver 403 00:41:55,160 --> 00:42:02,080 si la canica va a ser en minúscula. Y tener en cuenta que un poco las cuestiones de movimiento 404 00:42:02,080 --> 00:42:08,480 físico, las medidas son importantes porque sí que reaccionan según las dimensiones que tengan. 405 00:42:09,200 --> 00:42:16,280 Cuando veamos algo que no nos cuadra mucho, en ocasiones, y voy a borrar lo de la jerarquía, 406 00:42:16,280 --> 00:42:23,640 vuelvo aquí a este material que tenemos aquí, quizás tenemos que hacer esta conversión. Yo lo 407 00:42:23,640 --> 00:42:29,440 desmarco y cuando estamos editando assets en la jerarquía, estas opciones al final, para que se 408 00:42:29,440 --> 00:42:33,600 apliquen, hay que darle a este Apply. Hasta que no le demos aquí, todavía no le estamos diciendo 409 00:42:33,720 --> 00:42:39,720 que haga este cambio. De todos modos, si intentáis meter esta geometría, al meterla dice, oye, 410 00:42:39,720 --> 00:42:46,160 en el asset hay configuraciones que no se han aplicado y lo podemos hacer aquí. Pero bueno, 411 00:42:46,160 --> 00:42:56,280 que si lo hacemos previamente, mejor. Cancelo. No sé qué está haciendo. Me obliga a revertir, 412 00:42:56,280 --> 00:43:01,640 por mucho que le diga cancelar. Le digo, lo aplico. Y cuando lo aplico, veis que la escala 413 00:43:01,640 --> 00:43:11,640 ha cambiado. Ahora es así de grande y, de hecho, está orientada al revés. Ahora la escala, oye, 414 00:43:11,640 --> 00:43:17,720 pues nos puede interesar que esto mide... A ver cuánto mide... Una burrada, porque os he dicho 415 00:43:17,720 --> 00:43:22,720 que cada cuadrado de estos pequeños, que luego, si os alejáis, se van agrupando en conjuntos de 416 00:43:22,720 --> 00:43:30,680 10 por 10 metros, esto mide una barbaridad. ¿Qué podríamos hacer? Bueno, pues cambiar la escala. 417 00:43:30,680 --> 00:43:34,120 Lo que pasa es que la escala, si empezamos a tocar mucho y se ponen valores muy pequeños, 418 00:43:36,360 --> 00:43:39,880 pueden quedar valores muy pequeños y a veces nos interesa que esté siempre en el 1, 419 00:43:39,880 --> 00:43:45,320 para que sean siempre proporciones en relación al 1 y no haya que ir a medidas muy pequeñas o muy 420 00:43:45,320 --> 00:43:51,080 grandes. Para eso hay otro valor aquí, que es el valor de escala. Es decir, aparte de que nos haga 421 00:43:51,080 --> 00:43:57,720 esta conversión de valores, donde el 1 pasa a 0,01, es decir, 100 veces menos a nivel numérico, 422 00:43:57,720 --> 00:44:05,320 aunque a nivel físico sea la misma medida, este 1 centímetro 0,01 metros. Tenemos una especie de 423 00:44:05,320 --> 00:44:11,000 conversor de escalas fuera de la escala del transform, previo a meterlo incluso en la escena. 424 00:44:11,000 --> 00:44:15,200 Entonces yo, por ejemplo, aquí puedo decir, esto quiero que sea una quinta parte y cuando lo aplico, 425 00:44:15,200 --> 00:44:23,280 pues más o menos ya tiene las que yo buscaba. Este tipo de operaciones, os las indico para que 426 00:44:23,280 --> 00:44:28,360 las tengáis en cuenta. No hay una regla en esta práctica, que si fuera un personaje o una persona, 427 00:44:28,360 --> 00:44:35,600 pues sabemos que una persona puede medir entre 1,50 y 2 metros de altura. Y hay algo lógico. 428 00:44:35,600 --> 00:44:42,480 Aquí el tablero, por ejemplo, yo que he puesto, mide de largo como unos 10 metros, por lo que 429 00:44:42,480 --> 00:44:47,720 estamos viendo aquí. Y ya, pues sí, me imagino, si yo estuviera en ese escenario, pues si esto mide 430 00:44:47,720 --> 00:44:52,000 10 metros, la bola, para que tenga proporción, que la bola sí que la creamos nosotros, pues mide 431 00:44:52,360 --> 00:44:58,760 medio metro por medio metro. Vamos, medio metro de radio, o de diámetro, mejor dicho. 432 00:44:58,760 --> 00:45:07,560 Ya vamos trabajando según eso. Ya veremos, estas escalas de factor en este objeto, 433 00:45:07,560 --> 00:45:12,640 que no está animado o no tiene articulaciones, se puede cambiar y no hay mucho problema. Ya veremos 434 00:45:12,640 --> 00:45:22,400 que si hay un rigging ya o animaciones internas, cambiar la escala de un objeto ya rigueado puede 435 00:45:22,400 --> 00:45:29,480 modificar o afectar al rigging. Entonces pueden salir cosas extrañas. Por tanto, esto de convertir 436 00:45:29,480 --> 00:45:34,400 unidades no debería dar problema. Esto del factor de escala no lo deberíamos tocar cuando tengamos 437 00:45:34,400 --> 00:45:38,800 un objeto rigueado. ¿Qué es lo que habría que hacer? Pues que el modelador, o cuando estemos 438 00:45:38,880 --> 00:45:42,840 preparando este objeto, que ya esté en las dimensiones que queramos que tenga y no haya 439 00:45:42,840 --> 00:45:50,320 que reconvertir la escala en esto. Una vez tenemos eso, pues tenemos que generar una bola, 440 00:45:50,320 --> 00:45:57,160 que a esta bola además le podemos poner un material. Por ejemplo, yo he hecho un material 441 00:45:57,160 --> 00:46:02,400 que ya os enseñé el otro día, ya veremos más sobre materiales. Le he puesto un albedo, un color 442 00:46:02,400 --> 00:46:08,520 de base de este azul y lo he hecho metálico. Bueno, podéis trastear con esto. Ya os dije el otro día 443 00:46:08,520 --> 00:46:15,560 que para crear un material podéis crear un tipo de asset que es material y tiene los pases que 444 00:46:15,560 --> 00:46:20,840 tienen normalmente los shaders de 3D. Luego aquí hay varios shaders, esto ya es bastante más complejo. 445 00:46:20,840 --> 00:46:28,240 El que os pone por defecto ya os deja simular muchas cosas, como el nivel de metálico que tiene, 446 00:46:28,240 --> 00:46:36,400 la suavidad del smoothness o cómo el especular también se refleja o no, si está pulido o no. 447 00:46:36,560 --> 00:46:41,480 Y una vez queréis aplicarlo a un objeto, en el Mesh Renderer que tiene que tener ese objeto, 448 00:46:41,480 --> 00:46:48,560 lo arrastráis a materiales. Así se aplica. Por ejemplo, la textura que tenemos, por ejemplo, 449 00:46:48,560 --> 00:46:58,960 en el ítem que hay en la entrega, vienen un par de texturas para aplicarlo. Si vamos al objeto, 450 00:46:58,960 --> 00:47:02,800 en Mesh Renderer, hemos creado un material que se llama suelo. Lo voy a buscar, yo lo creé, 451 00:47:02,800 --> 00:47:12,800 y se llama material suelo, suelo 1. Y aquí lo que se ha puesto es un shader un poco más antiguo, 452 00:47:12,800 --> 00:47:19,360 pero si lo pusiéramos en un shader como este, podríamos decir que el albedo sea esta textura. 453 00:47:21,840 --> 00:47:26,400 Esta textura que tenemos aquí, que por cierto, cuando le damos a una textura que es un JPG, 454 00:47:26,400 --> 00:47:31,760 tiene sus propios valores de edición, ya lo veremos más cuando toquemos los sprites, 455 00:47:31,760 --> 00:47:39,440 y su Apply, que os vaya sonando, que según la naturaleza del elemento puede tener muchas opciones. 456 00:47:39,440 --> 00:47:47,040 Pero cuando hemos metido este terreno, si generamos un nuevo material, podemos decir 457 00:47:47,040 --> 00:47:56,240 el albedo que sea, y si le dais a estos puntitos que hay aquí, esto es verdad que no es el objetivo 458 00:47:56,240 --> 00:48:00,040 de la práctica, tanto los materiales, pero para que sepáis cómo se haría esa textura, 459 00:48:00,840 --> 00:48:08,120 la abro aquí, la tengo preparada. Otra cosa importante, cuando queráis, veis que yo estoy 460 00:48:08,120 --> 00:48:15,480 intentando arrastrar este color de esta textura a un elemento que ve aquí, pero cuando yo 461 00:48:15,480 --> 00:48:20,800 clico en la propia textura salen sus elementos. Para eso existe este candadito que tenemos aquí. 462 00:48:20,800 --> 00:48:25,920 Si yo por ejemplo vuelvo a los materiales y digo el de acero lo voy a convertir en lo de madera, 463 00:48:26,600 --> 00:48:32,880 necesito aquí tener los canales previstos. Puedo darle a este clic y ahora yo voy a donde quiera 464 00:48:32,880 --> 00:48:39,560 esta textura y la puedo arrastrar a estos cuadraditos que tenemos aquí. Y veis que se 465 00:48:39,560 --> 00:48:48,200 añade un mapa para usar en ese canal. Los canales entiendo que lo visteis ya todo en los passes de 466 00:48:48,200 --> 00:48:54,800 render, etc. Ya lo visteis en el módulo de color. Y aquí tenemos ya un mapa que se ha coloreado azul 467 00:48:54,960 --> 00:49:00,840 porque lo hemos tintado con este color que había puesto antes. El shader le estoy añadiendo texturas 468 00:49:00,840 --> 00:49:07,440 aquí con el metálico. Y aquí tenemos el mapa de normales que, por ejemplo, podemos arrastrar a la 469 00:49:07,440 --> 00:49:13,560 zona de normal map para que tenga esta rugosidad, esta simulación. Entiendo también que sabéis lo 470 00:49:13,560 --> 00:49:20,600 que es un mapa de normales, etc. Esto ya lo veremos más en próximos temas, pero para hacer 471 00:49:20,600 --> 00:49:25,720 una pequeña introducción. Entonces vuelvo para atrás porque esto era simplemente para hablar de 472 00:49:25,720 --> 00:49:31,200 las texturas, pero una vez tenemos la bola, por ejemplo, en este caso lo que tendremos que hacer 473 00:49:31,200 --> 00:49:41,120 y este va a ser el script que veremos ahora mismo. Cuando estamos generando esta bola, 474 00:49:41,120 --> 00:49:47,080 que ya la hemos puesto, y voy a quitar el candadito para poder ver sus opciones, le 475 00:49:47,080 --> 00:49:54,520 hemos puesto un PlayerManager, que básicamente lo que he hecho en este caso es, por un lado, 476 00:49:54,520 --> 00:50:01,920 y ojo, esto es importante, para poder aludir. Y por eso hubo un día que os dije, atención, que todo 477 00:50:01,920 --> 00:50:07,400 lo que vamos añadiendo aquí, estos bloquecitos con funcionalidades, son componentes, lo que 478 00:50:07,400 --> 00:50:11,800 se llaman componentes. Y os dije, en algún momento tendremos que acceder a los propios componentes. 479 00:50:12,760 --> 00:50:18,600 Este es el primer momento. Cuando queremos este script, está aplicado a la bola y esta bola, 480 00:50:18,600 --> 00:50:24,640 lo voy a hacer más pequeño, tiene varios componentes y uno de ellos es el RigidBody. 481 00:50:24,640 --> 00:50:30,560 No hablo mucho de cómo funcionan los colliders y el RigidBody porque creo que hay un vídeo 482 00:50:30,560 --> 00:50:37,440 ya en el tema que lo explica y podéis hacer prueba vosotros, si tenéis dudas, planteadlo. 483 00:50:38,040 --> 00:50:44,280 Pero cuando por código quiero acceder a algún campo de lo que tenemos aquí, algún dato, para 484 00:50:44,280 --> 00:50:50,040 variarlo o tener su valor, no se puede hacer directamente. Es decir, no podemos poner aquí 485 00:50:50,040 --> 00:50:58,680 variable ColliderSfera. Sí que se puede aludir al nombre del componente. Igual que aquí hay un 486 00:50:58,680 --> 00:51:06,720 RigidBody, también puede haber un SphereCollider. Y veis que aquí lo que básicamente he generado 487 00:51:06,720 --> 00:51:13,760 como variable global es una variable de tipo con el nombre de un componente. Esto es un poco raro 488 00:51:13,760 --> 00:51:18,960 al principio, pero igual que hacemos variables float o enteros o strings o lo que sea, podemos 489 00:51:18,960 --> 00:51:27,080 hacer que una variable sea de un tipo ya configurado por el propio software en un componente. A final 490 00:51:27,080 --> 00:51:32,680 de cuentas tenéis que pensar que un componente es un código que ya tiene dentro muchos comportamientos, 491 00:51:32,720 --> 00:51:38,520 muchas posibilidades. Este más, por ejemplo, en la clase RigidBody, en el código RigidBody, 492 00:51:39,840 --> 00:51:46,960 esto es un SerializedField para cambiar. Tiene una variable, probablemente un float, por eso salen 493 00:51:46,960 --> 00:51:54,160 decimales, de un float que se llama más. Y por eso sale igual que vosotros habéis configurado otros 494 00:51:54,160 --> 00:51:59,520 cuando instanciabais, etc. Al final están haciendo las mismas operaciones. De hecho, si vamos aquí a 495 00:51:59,640 --> 00:52:05,000 RigidBody, os dije que si os ponéis encima con la letra control os podéis meter dentro. Pues aquí 496 00:52:05,000 --> 00:52:09,720 hay un montón de cosas. Esta es lo que está haciendo, que se muestra aquí ese componente y 497 00:52:09,720 --> 00:52:16,480 que funcione de cierta forma. Y de hecho, si vamos viendo aquí, hay un public float más. Pues este 498 00:52:16,480 --> 00:52:22,600 más lo que está haciendo con un requiebro más complejo, que es un getter y un setter, esto es 499 00:52:22,600 --> 00:52:27,600 lo que muestra. Si yo borrara esta línea, que no lo voy a hacer porque es un método de Unity que no 500 00:52:27,600 --> 00:52:34,320 debemos tocar, al final está configurada así. Entonces, volviendo un poco a lo que estábamos 501 00:52:34,320 --> 00:52:42,520 viendo, podemos hacer que guardar dentro de este componente, de esta clase, que es como 502 00:52:42,520 --> 00:52:48,160 igual que aquí hemos creado la clase PlayerManager, que es un script, en el script RigidBody, 503 00:52:48,160 --> 00:52:56,000 en una variable que podremos usar para distintas cosas. Entonces ahora mismo estamos 504 00:52:56,160 --> 00:53:00,840 usando una variable que apela a este componente, y ya os he dicho, podemos hacer otro que se llame 505 00:53:00,840 --> 00:53:14,240 SphereCollider. Y ahí tenemos una variable que va a poder manejar en su interior lo relacionado 506 00:53:14,240 --> 00:53:19,160 con lo que hay en esa clase. De hecho, esto es el principio también para si en otro script 507 00:53:19,160 --> 00:53:23,920 de pronto ponemos PlayerManager, estaríamos hablando de este script para cambiar lo que 508 00:53:23,920 --> 00:53:29,720 hay dentro de este script. Igual me estoy adelantando un poco, pero eso que os suene, pues igual que 509 00:53:29,720 --> 00:53:40,200 hay un MeshRenderer, pues también habrá un Mesh. Y en el caso del MeshRenderer, que a veces 510 00:53:40,200 --> 00:53:44,480 también tiene funcionalidades, pues eso, hay clases ya que tienen lo que vemos aquí como 511 00:53:44,480 --> 00:53:49,840 componentes aquí esperando. Y una vez estamos aludiendo a este RigidBody, para cambiar que 512 00:53:49,840 --> 00:53:56,320 este RigidBody se mueva en una dirección u otra, que es darle comportamientos físicos, dentro del 513 00:53:56,320 --> 00:54:02,840 componente RigidBody hay una pestañita oculta que hay que desplegar con información de la velocidad 514 00:54:02,840 --> 00:54:11,040 hacia dónde se mueve, que veréis que cuando yo activo, a medida que yo voy moviendo el personaje 515 00:54:11,040 --> 00:54:18,520 o no, al final estamos añadiendo fuerzas físicas que tienen como unas orientaciones y tienen unos 516 00:54:18,520 --> 00:54:23,560 movimientos, etcétera. Todo esto nosotros podemos indicarle que en cierto momento tenga una 517 00:54:23,560 --> 00:54:30,880 velocidad hacia la profundidad Z de mucho, de 2, y entonces se le añade una fuerza para que el 518 00:54:30,880 --> 00:54:39,800 objeto se comporte de esta forma. Para acceder a todas estas variables o aplicar comportamientos 519 00:54:39,800 --> 00:54:46,640 en estas variables, hay que llegar a usar este RigidBody por código. Y aunque hayamos hecho esta 520 00:54:46,640 --> 00:54:53,520 variable que alude ya al componente, hay que hacer lo que se dice capturar o coger el componente. 521 00:54:53,520 --> 00:54:59,440 Y en el Start, normalmente, también se puede hacer en el Awake, ahora hablamos también un poco de esto, 522 00:54:59,440 --> 00:55:04,880 en esta variable que ya es de tipo RigidBody, por eso no hay que volver a poner la variable, ya la 523 00:55:04,880 --> 00:55:11,960 hemos declarado y luego decimos este RB que lo que haga es aludir al RigidBody que tiene este 524 00:55:12,280 --> 00:55:17,400 objeto, es decir, con GetComponent y aquí dentro, otra vez, sé que es redundante, hay que poner el 525 00:55:17,400 --> 00:55:24,640 nombre de ese tipo de componente, y esto se escribe así, hay que aprenderse esta sintaxis, 526 00:55:24,640 --> 00:55:32,640 cambiando aquí el tipo de componente, ya tenemos acceso con RB a las funcionalidades del RigidBody, 527 00:55:32,640 --> 00:55:38,640 lo relaciona con la física. Por eso siempre que queramos añadir una fuerza estamos haciéndolo 528 00:55:38,640 --> 00:55:46,320 en el RB.AddForce, un método que está dentro del componente de RigidBody, pues ya como viene 529 00:55:46,320 --> 00:55:53,080 en el tema, dándole una dirección, aquí estamos aplicando este input que tenemos aquí, para 530 00:55:53,080 --> 00:55:58,280 decirle hacia dónde se tiene que mover, y fuerza, que son variables que se han creado previamente, 531 00:55:58,280 --> 00:56:04,360 pues igual que para darle una speed antes al avión, pues para lo que sea, esta lo hemos generado 532 00:56:04,360 --> 00:56:09,560 aquí como Floats, para ir dándole más o menos fuerza con respecto a lo que se ha capturado con 533 00:56:09,560 --> 00:56:19,840 el input. Y fijaos que los input, los axis en este caso, se están cogiendo en el update, 534 00:56:19,840 --> 00:56:27,520 pero lo que son las fuerzas físicas se están aplicando en el FixedUpdate, y vais viendo que 535 00:56:27,520 --> 00:56:33,040 ya hay un Awake, por efecto viene el Start, el Update que ya os he dicho que se va cargando cada 536 00:56:33,040 --> 00:56:39,600 fotograma, y luego el FixedUpdate. El FixedUpdate, viene del tema, es un cálculo que no depende del 537 00:56:39,600 --> 00:56:44,040 procesador, es decir, si la máquina va más rápido no intenta dibujar más fotogramas por segundo, esto 538 00:56:44,040 --> 00:56:51,400 es una proporción fija de tiempo que se va generando cada cierto tiempo que despecifiquemos 539 00:56:51,400 --> 00:56:57,920 nosotros de manera fija. Esto de hecho, si nos vamos a los Project Settings, si no me equivoco, 540 00:56:58,760 --> 00:57:08,440 aquí los tenemos, en Físicas no es, es en Tiempo. En Tiempo, esto también venía en el tema, 541 00:57:08,440 --> 00:57:18,080 pero hay como que cada 0,02 haya un paso de tiempo fijo. 0,02 cada dos centésimas de segundo lo que 542 00:57:18,080 --> 00:57:25,400 haya aquí en el FixedUpdate se va a ejecutar. ¿Y por qué no se usa el Update? Porque al final los 543 00:57:25,400 --> 00:57:33,400 comportamientos físicos que los está generando toda la máquina, queremos que sean estables. Da 544 00:57:33,400 --> 00:57:39,720 igual, no queremos que cuanto antes se dibuje la imagen o cuanto antes capte el Input, si tenemos 545 00:57:39,720 --> 00:57:45,920 que esperar a que la persona le dé una tecla y lo capture, a lo mejor en el FixedUpdate si le hemos 546 00:57:45,920 --> 00:57:53,720 aumentado ese tiempo de refresco que hay, habría un poco de lag, porque entre que le das y llega 547 00:57:53,760 --> 00:58:00,680 a esta destrucción, porque lo hace cada dos décimas de segundo si lo cambiáramos a 0,2 en lo anterior 548 00:58:00,680 --> 00:58:05,760 que hemos visto, no es operativo. Pero sí que queremos que capture cuanto antes lo que está 549 00:58:05,760 --> 00:58:12,800 tocando el Input que esté haciendo el jugador, pues con el teclado, con el ratón, con lo que sea, 550 00:58:12,800 --> 00:58:22,160 con el device que sea, pero que los cálculos físicos se hagan siempre en torno a unos periodos de 551 00:58:22,160 --> 00:58:26,920 tiempo que ya maneja la máquina, para que sean más fiables y también estables. Entonces por eso 552 00:58:26,920 --> 00:58:35,480 se disgrega, por un lado se está cogiendo este MoveV, MoveH, y luego se aplica aquí. También 553 00:58:35,480 --> 00:58:42,240 hay otro método que se puede escribir que es el Awake. Recordad que el Start es cuando arranca 554 00:58:42,240 --> 00:58:49,640 el script, solo una vez ejecuta lo que hay aquí dentro y ya no más, como pasaría en el Update. 555 00:58:50,120 --> 00:58:56,640 El Awake es antes de que se ejecute ese script, cuando ya se está arrancando el juego, pues ya 556 00:58:56,640 --> 00:59:02,000 podemos poner instrucciones que estén precargadas. ¿Esto para qué sirve? Por ejemplo, si yo quiero 557 00:59:02,000 --> 00:59:12,120 desde un objeto aludir, por ejemplo, al instanciar en la práctica 1. A ver si doy un buen ejemplo. 558 00:59:13,120 --> 00:59:20,680 Si yo cuando instancio no arranco el script y no, digamos, le asigno la variable aquí, 559 00:59:20,680 --> 00:59:26,920 es decir, si aquí le digo coge este objeto que le he puesto por SerialIceField, lo declaramos aquí 560 00:59:26,920 --> 00:59:35,840 en el Start, hasta que no se arranque este script, no hace esa operación de asignar el objeto. 561 00:59:36,400 --> 00:59:45,320 Imaginaos que otro script alude al objeto que hayamos capturado en este script. Como no está 562 00:59:45,320 --> 00:59:50,680 cargado hasta que lo lancemos, si ese GameObject no está activo, no sabe dónde buscar. Pero si 563 00:59:50,680 --> 00:59:57,080 está precargado, sí, porque independientemente de que se lance o no, de que se ejecute el objeto, 564 00:59:57,080 --> 01:00:02,760 el GameObject, el script ya tiene algo dentro. Entonces a veces hay operaciones que es normal 565 01:00:02,760 --> 01:00:08,280 hacer en el Awake. Y luego hay otro de los básicos, hay alguno más por ahí, que es el 566 01:00:08,280 --> 01:00:16,200 VoidLateUpdate, que se ejecuta después de todos, vamos, de los últimos. Esto, por ejemplo, se usa 567 01:00:16,200 --> 01:00:21,720 para los seguimientos de cámara que ya hemos hecho en algún momento, por ejemplo, con el avión. Y por 568 01:00:21,720 --> 01:00:26,560 ejemplo, todo el seguimiento que haga la cámara de otros objetos, porque es dependiente de lo que 569 01:00:26,560 --> 01:00:32,600 hagan otros objetos en su Update y en el FixedUpdate, es preferible que haga bien el cálculo ya una vez 570 01:00:33,080 --> 01:00:37,760 se ha calculado el resto de elementos en el FixedUpdate. Porque teniendo en cuenta que el Update 571 01:00:37,760 --> 01:00:43,920 es común a todos los scripts que tengamos, todos irán ejecutando lo del Update en cada fotograma. 572 01:00:43,920 --> 01:00:49,640 Entonces, en este paso, cuando todos los Updates de todos los programas hayan hecho sus operaciones, 573 01:00:49,640 --> 01:00:55,520 le decimos, ahora, antes de que llegue el siguiente fotograma, rápidamente ejecuta lo que hay aquí, 574 01:00:55,520 --> 01:00:59,840 si es, por ejemplo, la posición de la cámara que siga a otro objeto. Pues ya se ha calculado 575 01:00:59,920 --> 01:01:09,040 correctamente todo para ya hacer ese seguimiento. De hecho, lo tengo aquí preparado. Si buscáis, 576 01:01:09,040 --> 01:01:14,400 esto también creo que os lo he dejado por ahí, si no, os digo cómo buscarlo. Si ponéis en Google 577 01:01:15,400 --> 01:01:28,320 orden de ejecución en Unity, bueno, nos lo ha puesto en la versión 2019, es igual, en la siguiente, 578 01:01:28,320 --> 01:01:34,360 en los manuales de Unity, mirad que también a veces se puede filtrar por qué versión. Como 579 01:01:34,360 --> 01:01:42,600 estamos usando la 2020.3, la más cercana de estas es esta. Y aquí hay una infografía que va diciendo 580 01:01:42,760 --> 01:01:48,240 por orden, de arriba a abajo, el orden de ejecutado que os estoy diciendo. Empezaría con el Awake, 581 01:01:48,240 --> 01:01:54,720 incluso antes de que se inicialice el editor o según arranca el editor. Luego, ya el Start, 582 01:01:54,720 --> 01:02:01,080 cuando se inicializa el Script. Y así podemos, el Fixed Update, que no es que se ejecute antes 583 01:02:01,080 --> 01:02:08,120 que el Update, aunque esté más abajo, sino porque como es algo estable, cada cierto tiempo van un 584 01:02:08,160 --> 01:02:13,480 poco en paralelo, porque a lo mejor el Update va más rápido o menos rápido, pero este sí es fijo. Y 585 01:02:13,480 --> 01:02:18,440 aquí se van ejecutando ciertas acciones, algunas como el OnTrigger y el OnCollision, pues ya lo 586 01:02:18,440 --> 01:02:24,320 vamos a usar en esta práctica. Hay distintas, el Update, aquí se calculan muchas cosas y cuando 587 01:02:24,320 --> 01:02:29,640 ya calcula todo hasta aquí, el LateUpdate, lo que os acabo de decir. Y luego hay otras operaciones, 588 01:02:29,640 --> 01:02:34,200 pues como de cierre, los Destroys, que no es exactamente el Destroy que os he comentado antes, 589 01:02:34,320 --> 01:02:41,640 pero algo tiene que ver para cerrar la aplicación, para destruir también la aplicación a nivel 590 01:02:41,640 --> 01:02:47,520 de ejecución. Aquí tenéis el orden y ese orden es importante por lo que estamos viendo. Ya en este 591 01:02:47,520 --> 01:02:54,400 punto empieza a serlo. Por eso, todo lo que sea captar Inputs lo haremos en Update, todo lo que 592 01:02:54,400 --> 01:03:00,240 sea aplicar fuerzas o cuestiones físicas, que haya un movimiento físico, un cálculo físico, lo suyo 593 01:03:00,320 --> 01:03:06,240 es hacerlo en el FixedUpdate. En el Update va a funcionar, pero aquí es donde va a estar mejor 594 01:03:06,240 --> 01:03:12,480 calculado. ¿Hasta aquí qué tal? Sé que estoy contando bastantes cosas, aunque varias estaban 595 01:03:12,480 --> 01:03:19,240 ya en el tema. De hecho, muchas y otras ya las había contado Álvaro en el vídeo. ¿Qué tal? ¿Me 596 01:03:19,240 --> 01:03:29,680 vais siguiendo? Es decir, eso es que me vas siguiendo. Bueno, hemos puesto que entiendas 597 01:03:29,680 --> 01:03:37,600 un poco. Por eso tampoco quiero ir muy adelante, porque hasta que no os pongáis... Os leáis el tema 598 01:03:37,600 --> 01:03:43,280 lo primero, veáis los vídeos que hay ya y os pongáis a encarar la tarea, no vais a ir viendo 599 01:03:43,280 --> 01:03:50,160 cómo funciona esto. Para que os hagáis una idea, os dejo el de la bola, porque luego el de la tabla 600 01:03:50,160 --> 01:03:56,200 es igual con un torque, pero se aplicaría igual. Habría que capturar el RigidBody y luego ya 601 01:03:56,200 --> 01:04:04,480 podremos, con el punto que marca, que permite ver los métodos y lo relaciona con las físicas que 602 01:04:04,480 --> 01:04:09,400 hay dentro del componente RigidBody, pues aquí estoy añadiendo esta fuerza con la dirección. 603 01:04:09,400 --> 01:04:18,440 Esto lo pone en los apuntes. Aquí lo que estamos haciendo es, lo primero, en el Start, cuando 604 01:04:18,440 --> 01:04:24,280 se empiece el script a ejecutar, quiero que en todo momento haya una variable que está accediendo al 605 01:04:24,280 --> 01:04:28,440 RigidBody de ese objeto. Porque como no estoy diciendo que sea de otro objeto, que esto 606 01:04:28,440 --> 01:04:32,160 también se puede hacer, me estoy refiriendo al RigidBody del mismo objeto. Igual que cuando 607 01:04:32,160 --> 01:04:39,440 ponemos transform, estamos hablando aquí transform position. Aquí no hay que hacer esto de GetComponent 608 01:04:39,440 --> 01:04:45,880 porque hay una especie de atajo para hablar de este transform sin tener que capturarlo, pero 609 01:04:45,880 --> 01:04:51,600 habla del transform de este objeto. Pues igual, aquí ahora al coger el componente, que, ojo, tiene que 610 01:04:51,600 --> 01:04:58,120 estar aplicado, tiene que haber un componente RigidBody, dice, vale, pues en RB ya puedo acceder a 611 01:04:58,120 --> 01:05:03,160 todo lo relacionado con este componente. Y posteriormente, en el Update, pues igual que hemos 612 01:05:03,160 --> 01:05:11,000 hecho con la nave, guardamos en una variable los inputs y posteriormente hacemos la mezcla de los 613 01:05:11,000 --> 01:05:16,280 dos ingredientes en donde se calculan las físicas. Y decimos, dentro de ese RigidBody, vamos a aplicar 614 01:05:16,280 --> 01:05:22,000 una fuerza o atorque, si lo que quisiéramos es que haga una rotación. Y aquí tendremos que decirle, 615 01:05:22,000 --> 01:05:28,960 en esta dirección, según cuánto estemos metiendo de input, recordad que en un Axis, si no estamos 616 01:05:28,960 --> 01:05:37,240 pulsando nada, es cero. Si pulsamos la tecla del eje positivo, será uno, o si es la negativa, 617 01:05:37,240 --> 01:05:42,800 menos uno. Igual que hicimos con la nave. Por una fuerza, que es este valor que hemos metido 618 01:05:42,880 --> 01:05:54,560 en una variable global. Entonces ya con esto, por ejemplo, tenemos que la bola se va moviendo. 619 01:05:57,440 --> 01:06:02,240 Importante, error típico. Cuando hagáis el seguimiento de la bola, en este caso, tened 620 01:06:02,240 --> 01:06:07,880 en cuenta que al ser una bola, está rotando. No se nota mucho, pero está rotando. Si luego 621 01:06:07,920 --> 01:06:13,760 ponemos que la cámara, como hacemos aquí, siga con un Offset, como hicimos en la nave, 622 01:06:13,760 --> 01:06:23,520 siga con un Offset a la bola, tened en ojo que lo que tiene que seguir es el Transform, 623 01:06:23,520 --> 01:06:28,560 pero la posición, no la rotación. Porque si decís que siga la rotación, fijaos que yo selecciono 624 01:06:28,560 --> 01:06:34,760 la bola y yo cuando mueva, está cambiando la rotación. Si hacemos que la cámara siga la 625 01:06:34,760 --> 01:06:40,280 rotación, va a empezar a moverse para todos lados. Os lo enseño aquí rápidamente. 626 01:06:42,280 --> 01:06:49,720 No me gusta enseñaros mucho los scripts hasta que lo probáis vosotros, porque si no, 627 01:06:49,720 --> 01:06:58,360 intentáis solo copiar el código y tampoco es lo suyo. Fijaos que aquí lo que va a hacer es, 628 01:06:58,360 --> 01:07:02,880 ponemos el decalaje como la otra vez, pero lo que va a ir moviendo es el Transform.Position, 629 01:07:02,880 --> 01:07:11,040 no el Transform a pelo. Va a haber un Transform.Position y no la rotación. Donde se mueva 630 01:07:11,040 --> 01:07:16,240 la bola, allá que va la cámara, con este decalaje que tenemos aquí, con el Offset, que es igual que 631 01:07:16,240 --> 01:07:22,400 el que hicimos el otro día en la última tutoría. Y aparte, aunque en esta no es tan importante, 632 01:07:22,400 --> 01:07:29,160 pero en las siguientes escenas sí, ya se ve en la teoría también el método de Transform.LookAt, 633 01:07:29,160 --> 01:07:35,000 que es que la rotación va a ser dependiente de donde esté la cámara, donde esté el objeto que 634 01:07:35,000 --> 01:07:41,040 sigue, que en este caso es la bola. ¿Esto qué significa? Que, por ejemplo, en el nivel 2... 635 01:07:46,920 --> 01:07:54,160 Escenas, nivel 2. Yo no sé qué he cambiado, yo creo que nada importante. Aquí tenemos la cámara 636 01:07:55,160 --> 01:08:02,120 con un Offset y se va moviendo con la cámara, pero si la bola rotara o se moviera, la cámara 637 01:08:02,120 --> 01:08:07,840 siempre está orientando. Por ejemplo, veis que aunque la posición vaya bajando o subiendo, 638 01:08:07,840 --> 01:08:14,280 la cámara siempre está intentando enfocar hacia donde esté la bola. Con LookAt, la rotación de 639 01:08:14,280 --> 01:08:23,560 la cámara será dependiente a donde esté la bola. Ahora está tan rígido que está siguiendo la bola 640 01:08:23,880 --> 01:08:30,240 como si fuera una especie de grúa que sigue a cierta distancia, pero podemos hacer que en vez 641 01:08:30,240 --> 01:08:38,400 de seguir exactamente la posición con un decalaje, esté donde esté la bola, se vaya orientando hacia 642 01:08:38,400 --> 01:08:43,240 donde esté ahí. Entonces siempre mira la cámara desde su posición hacia donde esté la bola y 643 01:08:43,240 --> 01:08:50,440 cambiaría la posición. Si queréis, lo hago en un segundo. Me meto en el Script, lo abro a ver qué 644 01:08:50,440 --> 01:09:03,960 está por aquí. Este no es. A ver, tampoco. Aquí. Imaginaos que yo le digo el Transform Position 645 01:09:03,960 --> 01:09:11,800 que no se mueva, es decir, le voy a decir, ojo, la bola se va a mover, lo voy a comentar, pero 646 01:09:11,800 --> 01:09:18,280 realmente en el Fixed Update, y aquí la verdad es que no sé por qué puse Fixed Update, sería 647 01:09:18,280 --> 01:09:24,280 explicándolo o algo así, es en el Update, o mejor aún, como os he dicho antes, en el Late Update, 648 01:09:24,280 --> 01:09:30,440 lo que estamos haciendo es, bueno, aquí hemos generado una variable Posición 3 que me da el 649 01:09:30,440 --> 01:09:34,760 decalaje, las coordenadas de dónde debería estar la cámara con ese decalaje y luego se lo aplicamos 650 01:09:34,760 --> 01:09:39,720 al Transform. Ahora mismo esto no hace nada puesto que no está afectando al Transform y lo que hemos 651 01:09:39,720 --> 01:09:45,400 hecho aquí es que la cámara esté mirando a la bola. Ahora lo que vamos a conseguir es que desde 652 01:09:45,400 --> 01:09:55,360 su posición, vais a ver que cuando se va moviendo la plataforma, si veo las coordenadas de posición, 653 01:09:55,360 --> 01:10:01,440 la cámara no se está moviendo como pasaba antes, sino que lo que va a ir es orientándose hacia 654 01:10:01,440 --> 01:10:06,040 donde esté la bola, desde su posición, ni sube ni baja. Entonces si baja, por ejemplo, la bola, 655 01:10:06,040 --> 01:10:11,120 pues la cámara... No hay muchos objetos que dé en perspectiva de... Habría que poner un fondo o 656 01:10:11,120 --> 01:10:17,000 otros objetos para saber qué es arriba y abajo, que ahora mismo no es muy claro, pero es la cámara... 657 01:10:17,000 --> 01:10:23,160 Vuelvo a ejecutarlo aquí. Realmente no se está moviendo como pasaba antes, sino que rota para ir 658 01:10:23,160 --> 01:10:28,760 siguiendo ese objeto. Para eso sirve el LookAt, simplemente que os suene porque a veces es muy útil. 659 01:10:28,760 --> 01:10:35,920 Aquí, a ver... Late Update va mejor, como os he dicho antes, para la cámara y el Transform. 660 01:10:36,720 --> 01:10:47,400 No sé si algo más para empezar. Podéis seguir. Una cuestión más es los OnTriggerEnter, 661 01:10:47,400 --> 01:10:55,040 los OnCollider, pero intentad hacerlo vosotros con lo que ya se ve en el tema. Para el próximo 662 01:10:55,040 --> 01:11:01,440 tutorial, planteadme dudas y si os encontráis con dudas, me las indicáis, porque lo que habrá 663 01:11:01,440 --> 01:11:10,560 que hacer es... Voy al nivel 1, que se ve un poco mejor. En el nivel 1, por ejemplo, claro, hay que pensar 664 01:11:10,560 --> 01:11:17,160 dos cosas. Primero, que cuando la bola se caiga, hay que decirle de algún modo, oye, cuando se caiga 665 01:11:17,160 --> 01:11:26,560 la bola, pues hay que reiniciar el nivel. Para eso, en el precipicio, se ha puesto un Collider, es decir, 666 01:11:26,560 --> 01:11:31,880 se ha creado un objeto nulo y solo se ha puesto un BoxCollider. Aquí no hay MeshRenderer, no se ve nada. 667 01:11:31,880 --> 01:11:37,240 Es lo contrario que he dicho antes. Aquí no hay apariencia, aquí es solo un área que hemos definido, 668 01:11:37,240 --> 01:11:43,680 con un área que lo que hace es que cuando caiga la bola y entre aquí, se desencadena acción. 669 01:11:43,680 --> 01:11:50,440 Para eso son, por código, los OnTrigger y los OnCollisionEnters. Son métodos que existen. 670 01:11:50,720 --> 01:11:55,320 Importante, cuando tenemos un Collider, 671 01:11:57,640 --> 01:12:03,360 por ejemplo, aquí voy a añadir otro, un SphereCollider, uno con forma de 672 01:12:04,520 --> 01:12:14,280 esfera. Voy a poner SMSCollider, lo voy a ubicar cerca de la bola. 673 01:12:14,960 --> 01:12:18,840 Veis que aquí tengo otra esfera que se controla en sus coordenadas desde el propio 674 01:12:20,360 --> 01:12:25,320 componente del Collider y voy a poner 675 01:12:27,160 --> 01:12:34,840 que este, perdón, que como lo estoy metiendo en un objeto que está abajo, es complicado ajustarlo. 676 01:12:35,200 --> 01:12:46,800 Dejo ahí la bola y lo que os decía, tengo este Collider que lo voy a poner justo debajo 677 01:12:46,800 --> 01:12:53,280 de la bola. Lo muevo para que esté justo debajo de la bola. Entonces yo cuando lance el juego, 678 01:12:53,280 --> 01:13:02,040 por defecto, la bola se queda ahí y lo detecta. Eso es una malla. La cosa es que cuando por defecto 679 01:13:02,040 --> 01:13:08,600 metemos un Collider del tipo que sea, viene así. Podemos cambiar las coordenadas, el radio, 680 01:13:08,600 --> 01:13:14,600 según el tipo de Collider puede tener opciones distintas. Pero hay una opción común a todos que 681 01:13:14,600 --> 01:13:21,040 es esta de IsTrigger y esto creo que es algo muy simple pero que a veces cuesta entender. Si no 682 01:13:21,040 --> 01:13:27,120 está marcado, que es como viene por defecto, ya lo veis, esta malla sirve para que choque las cosas 683 01:13:27,120 --> 01:13:31,400 con ella. Por ejemplo, lo que habéis visto que ahora mismo está colisionando en el sentido de 684 01:13:31,400 --> 01:13:37,760 que choca con ella. Pero es que los Colliders también se usan para definir áreas que desencadenan 685 01:13:37,760 --> 01:13:43,560 cosas pero que no necesariamente tienen que tener una apariencia física de que algo choque con ello. 686 01:13:43,560 --> 01:13:52,800 Por ejemplo, si yo ahora mismo a este Collider le dijera IsTrigger, vais a ver que lo atraviesa. 687 01:13:53,760 --> 01:13:56,560 Uy, espera, aquí está pasando algo, un segundín. 688 01:14:01,280 --> 01:14:09,120 Vale, sí, ya sé lo que está pasando. Básicamente tengo que desactivar donde estábamos, en precipicio. 689 01:14:09,120 --> 01:14:13,680 Imaginaos que no está este script todavía, que hace otras cosas. Lo que estaba pasando es que 690 01:14:13,680 --> 01:14:17,640 cuando atraviesa esto se estaba reiniciando el nivel, que es lo que he dicho que pase cuando 691 01:14:17,640 --> 01:14:21,840 toque esta caja. Vuelvo a darle. Ahora, el Sphere Collider... 692 01:14:23,680 --> 01:14:27,880 Vale, sí, lo que pasa es que se sigue haciendo de todos modos. 693 01:14:32,880 --> 01:14:34,240 Move up el componente. 694 01:14:37,080 --> 01:14:44,200 Debe haber otro otro punto por aquí que está haciendo que cuando toque el IsTrigger de esta 695 01:14:44,200 --> 01:14:53,640 esfera se ejecute lo que tengo en precipicio. Voy a hacer otra cosa que igual es lo que debería 696 01:14:53,640 --> 01:14:58,120 haber hecho. Voy a eliminar este Sphere Collider que le he puesto de muestra, lo borro, como si no 697 01:14:58,120 --> 01:15:05,320 hubiera pasado nada. Voy a generar un cubo muy rápido, que lo pongo en el 0,0 para que esté por 698 01:15:05,320 --> 01:15:14,680 ahí. Ese cubo ahora es visible porque, por defecto, viene con un Mesh Renderer. 699 01:15:14,680 --> 01:15:19,520 Lo que os he dicho, el Mesh Renderer da la apariencia, pero yo no la quiero. Cuando creamos una 700 01:15:19,520 --> 01:15:26,080 primitiva, tiene este Collider ya activado sin el IsTrigger y vais a ver que se 701 01:15:26,080 --> 01:15:31,720 queda ahí flotando la bola porque detecta esa superficie. Si yo lo pongo en IsTrigger y la 702 01:15:31,720 --> 01:15:39,720 lanzo, vais a ver que la atraviesa. Aunque hay un Collider, no existe. Y IsTrigger significa 703 01:15:39,720 --> 01:15:46,440 disparador, como para disparar. En una pistola el trigger es el gatillo. Esto sirve para decir 704 01:15:46,440 --> 01:15:52,080 que cuando la bola pase cierta área que hemos marcado con un Collider, decirle que ha atravesado 705 01:15:52,080 --> 01:15:56,280 una puerta o se ha caído la bola y cuando llega aquí abajo es que ha perdido, que es lo que hemos 706 01:15:56,280 --> 01:16:02,320 hecho en el precipicio. Y aquí hay un script, IsTrigger, es decir, cuando la bola llegue hasta aquí 707 01:16:02,320 --> 01:16:07,240 abajo no va a colisionar con esto, va a seguir bajando, pero sí que atraviesa un área que nosotros 708 01:16:07,240 --> 01:16:13,760 detectamos para hacer otras acciones. Si yo, por ejemplo, enseño este precipicio, aunque tiene 709 01:16:13,760 --> 01:16:19,320 cosas más avanzadas, lo que me importa, que viene en el tema también para que investiguéis, es que se 710 01:16:19,320 --> 01:16:24,560 puede crear, igual que un Void Start, un Void Update, como viene el Void Awake, que os he dicho 711 01:16:24,560 --> 01:16:31,360 antes, hay otro tipo de Voids que son los OnTrigger. Y hay un OnTriggerEnter, es decir, en cuanto un 712 01:16:31,360 --> 01:16:37,000 objeto entre en un área que tenga un trigger, es decir, un Collider, con esto activado de trigger, 713 01:16:37,000 --> 01:16:43,160 pues yo puedo decirle en cuanto toque esto hago tal, que en este caso es que se reinicie el nivel. 714 01:16:43,160 --> 01:16:48,440 Esto lo hablamos otro día, viene en los apuntes nuevamente, pero hoy si no nos alargamos mucho. 715 01:16:49,080 --> 01:16:56,400 Cuando entre, puedo decirle también que sea cuando salga, o si pongo OnTriggerStay, es el 716 01:16:56,400 --> 01:17:03,760 tiempo que esté aquí dentro, que se ejecute lo que hay aquí. El tiempo que en este caso otro Collider, 717 01:17:03,760 --> 01:17:09,920 como el de esta bola, esté tocando este OnTrigger, podemos decirle que haga órdenes. Por ejemplo, 718 01:17:09,920 --> 01:17:18,200 estamos en un nivel con puertas y que al atravesar una puerta se active, que suene 719 01:17:18,200 --> 01:17:24,240 una alarma. Para que detecte eso, el personaje tendrá un Collider, que aparte de servir para, 720 01:17:24,240 --> 01:17:32,360 si no es trigger, para que tenga un pie que se posa en el suelo y no le deja pasar, sirve que 721 01:17:32,360 --> 01:17:37,120 ese Collider atraviese otro que hemos puesto la puerta, que ese sí que es trigger, para que detecte 722 01:17:37,120 --> 01:17:42,600 que estás pasando la puerta y ya desencadenar, por ejemplo, el sonido de una alarma. Ahí ya, 723 01:17:42,600 --> 01:17:50,320 nuevamente en el código, iremos especificando qué hace. Esto de ElixTrigger es esencial para ir 724 01:17:50,320 --> 01:17:56,080 gestionando que cuando ocurra algo, como por ejemplo, queremos que llegue a este agujero. Si os 725 01:17:56,080 --> 01:18:01,440 fijáis, yo tengo aquí un elemento que se llama Goal, que no tiene MeshRenderer, no se ve nada, 726 01:18:01,440 --> 01:18:07,640 pero si vamos aquí, el Goal es, y me meto en el agujerín, vais a ver que cuando la bola se mete, 727 01:18:07,680 --> 01:18:13,480 cuando llega a este trigger que está marcado por ese cuadrado, cuando la bola toca ese trigger, 728 01:18:14,640 --> 01:18:18,960 dice, pues hay que cambiar de nivel. Y este es el funcionamiento, por ejemplo, 729 01:18:18,960 --> 01:18:26,640 para cambiar de nivel. Yo tengo aquí un script que dice, me meto. Cuando algo entre en el trigger 730 01:18:26,640 --> 01:18:34,480 que tengo, si el otro objeto, esto ya lo veremos, es la bola, si el nombre es la bola, pues lanza 731 01:18:34,480 --> 01:18:41,000 otra escena. Entonces, ese es el funcionamiento del OnTrigger. También existe otro método muy 732 01:18:41,000 --> 01:18:47,000 parecido, que es el que se llama On. Y esto de OnTrigger, no hace falta que escribáis todo, 733 01:18:47,000 --> 01:18:52,400 si empezáis a escribir OnTrigger, ya os salen las opciones. Y ojo, si no estamos trabajando en 2D, 734 01:18:52,400 --> 01:18:57,320 que no es el caso todavía, siempre el que no pone 2D, que veréis que hay muchos. Por ejemplo, 735 01:18:57,320 --> 01:19:05,200 el OnTriggerEnter. Pues empiezo. Me lo ha escrito ahí. ¿Y por qué no sale el OnTriggerEnter y sale 736 01:19:05,200 --> 01:19:13,320 en el resto? OnTrigger. A ver. OnTriggerEnter 2D. Ah, vale, porque como ya hay un OnTriggerEnter, 737 01:19:13,320 --> 01:19:18,400 no se puede escribir otro. Si no existiera este OnTriggerEnter, si, por ejemplo, yo pongo aquí 738 01:19:18,400 --> 01:19:23,680 Stay, que es el de permanecer dentro, OnTrigger. Empezáis a escribir y ya le dais aquí y os lo 739 01:19:23,680 --> 01:19:35,080 completa. Incluso os abre las llaves. Hay otro tipo que es el OnCollision, Enter, Exit, Stay, 740 01:19:35,080 --> 01:19:41,160 también con su versión en 2D, que eso significa que si este Collider no lo hemos marcado, por ejemplo 741 01:19:41,160 --> 01:19:48,960 el de la bola, como trigger, es decir, que sí que lo percibe una superficie con la que choca en el 742 01:19:48,960 --> 01:19:54,160 juego, también se puede decir que cuando choca algo no lo va a atravesar. Cuando choca, que 743 01:19:54,160 --> 01:19:58,080 desencadena en otras opciones. Por eso hay otro muy parecido, pero que no es exactamente igual, 744 01:19:58,080 --> 01:20:02,880 que es este que os estaba comentando de OnCollision. A ver dónde tengo yo este escribido. Ahora, 745 01:20:02,880 --> 01:20:10,800 ¿qué estaba escribiendo? El OnTriggerEnter. A ver, que tengo aquí un buen jaleo. 746 01:20:10,800 --> 01:20:19,320 Este que tenemos aquí. El OnCollision, igual, cuando choque con el objeto, cuando choque y 747 01:20:19,320 --> 01:20:25,720 deje de chocar, que sería el Exit, pues el Enter, y os crea esto. Ya veremos lo que son estos 748 01:20:25,720 --> 01:20:31,560 argumentos que pasa aquí, entre paréntesis, porque con esto podemos decir que el objeto que haya 749 01:20:31,560 --> 01:20:36,360 chocado, si se llama de tal manera que sea el que haga las acciones. Podemos hacer condiciones 750 01:20:36,400 --> 01:20:43,400 más avanzadas. O que cuando choque un objeto con este, si el que choca tiene una etiqueta de 751 01:20:43,400 --> 01:20:53,200 enemigo, pues entonces sí que se muere el enemigo. Si lo que choca es la bala, pues que entonces se 752 01:20:53,200 --> 01:20:57,360 incruste. Entonces podemos ir discriminando qué acciones. Pero creo que ya, si os sigo hablando 753 01:20:57,360 --> 01:21:03,480 más por hoy, y más si nos habéis puesto a hacer la tarea, solo voy a quemar la cabeza. 754 01:21:06,360 --> 01:21:12,360 Más información www.alimmenta.com