1 00:00:01,520 --> 00:00:22,379 Hoy vamos a empezar a hablar, o vamos a enfocar más, en lo relativo al motor de físicas y, bueno, pues ya importar alguna geometría, digamos, con más detalles relacionados, por ejemplo, con los colliders, para que haya colisiones y se encuentren los objetos entre sí a nivel físico, etcétera, ¿vale? 2 00:00:22,379 --> 00:00:25,420 Bueno, como pone en el propio enunciado 3 00:00:25,420 --> 00:00:26,539 Que lo tengo por aquí 4 00:00:26,539 --> 00:00:27,440 Ahí está 5 00:00:27,440 --> 00:00:29,339 Hay que conseguir el objetivo 6 00:00:29,339 --> 00:00:31,219 Y a veces los juegos son un poco simples 7 00:00:31,219 --> 00:00:33,619 Pero de lo que se trata es de poneros en tesituras 8 00:00:33,619 --> 00:00:37,359 Que no son las más obvias 9 00:00:37,359 --> 00:00:40,960 Pero que si sabéis implementar en un juego simple 10 00:00:40,960 --> 00:00:42,939 Sabéis extrapolarlo a otros 11 00:00:42,939 --> 00:00:45,240 ¿Vale? Bueno, consiste en que con físicas 12 00:00:45,240 --> 00:00:46,179 Movamos una pelota 13 00:00:46,179 --> 00:00:50,840 Que se va a ir metiendo en estos agujeros objetivos 14 00:00:50,840 --> 00:00:58,520 y que si la pelota se cae de esta, dependiendo del nivel, será de una forma u otra, si se va cayendo la bola de la plataforma, 15 00:00:58,719 --> 00:01:05,700 pues se pierde y se reinicia el nivel. Cada vez que llegamos a uno de estos objetivos, se pasa a otro nivel, a un nivel siguiente. 16 00:01:06,280 --> 00:01:12,560 Esto ya implica, y lo veis aquí, que tiene que haber diferentes escenas que corresponden con cada uno de los niveles. 17 00:01:13,340 --> 00:01:23,260 En la unidad 4 se habla más sobre las escenas o la gestión entre escenas y en el enunciado ya de este tema se esboza un poco cómo hacerlo. 18 00:01:23,760 --> 00:01:31,640 Por tanto, no es mala idea que en cierto momento también empecéis a leer la unidad 4 antes de entregar esta. 19 00:01:32,060 --> 00:01:40,060 Pero yo creo que se explica más o menos adecuadamente, o sea, la introducción necesaria para hablar de estos cambios de tareas en esta sección de aquí 20 00:01:40,060 --> 00:01:43,239 que habla del Scene Management y de los Build Settings, ¿vale? 21 00:01:43,640 --> 00:01:46,879 Lo mismo, leeros los enunciados, siempre del tirón, 22 00:01:47,439 --> 00:01:51,760 hacéis una primera lectura para, aunque os suene un poco extraño a veces, 23 00:01:52,060 --> 00:01:54,340 lo que se está hablando, tener una idea general, 24 00:01:54,760 --> 00:01:57,819 y luego ya se va desglosando y avanzando poco a poco. 25 00:01:58,560 --> 00:02:00,219 ¿Vale? Entonces el juego consiste en eso. 26 00:02:00,420 --> 00:02:02,859 Para la tarea se os aportaban unos FBX, 27 00:02:04,599 --> 00:02:09,960 entiendo que ya en módulos como en el de animación o en el de modelado, 28 00:02:10,060 --> 00:02:30,159 O incluso en el de color. Habréis visto formatos de exportación y uno de ellos es el FBX. Pero básicamente los FBX son paquetes de distintos componentes. Es decir, pueden incluir luces, pueden incluir mallas, pueden incluir los materiales. 29 00:02:30,159 --> 00:02:35,439 No es como el OBJ, que está destinado solo a guardar una geometría. 30 00:02:35,740 --> 00:02:47,000 Sin más, aquí vais a ver que cuando arrastráis esos FBX, se van a ver así, con este triangulito que permite desplegar qué contiene ese FBX. 31 00:02:48,139 --> 00:02:51,860 Y veis que hay diversas cosas, y en algunos ahí puede haber más que en otras. 32 00:02:52,159 --> 00:02:55,379 Eso dependerá de cómo se haya creado y se haya guardado ese FBX. 33 00:02:55,379 --> 00:02:58,840 esto significa que cuando arrastramos 34 00:02:58,840 --> 00:03:00,719 lo normal es, tengo una geometría 35 00:03:00,719 --> 00:03:02,840 y la arrastro a nuestra jerarquía 36 00:03:02,840 --> 00:03:04,360 ¿vale? vais a ver 37 00:03:04,360 --> 00:03:06,439 una cosa que al principio 38 00:03:06,439 --> 00:03:08,520 molesto, pero que es que dices, ah, tengo varios 39 00:03:08,520 --> 00:03:10,740 bueno, vais a ver que aquí tengo 40 00:03:10,740 --> 00:03:12,819 el collider como game object 41 00:03:12,819 --> 00:03:14,500 ¿vale? y luego hay otra malla que es este 42 00:03:14,500 --> 00:03:16,020 terreno 1 collider, veis que 43 00:03:16,020 --> 00:03:18,560 está el propio game object, que es el que agrupa 44 00:03:18,560 --> 00:03:20,199 SFBX, más luego 45 00:03:20,199 --> 00:03:22,740 si clicamos, la propia malla 46 00:03:22,740 --> 00:03:25,039 que tiene dentro SFBX 47 00:03:25,039 --> 00:03:36,879 que puede ir de manera independiente. Y cuando tenéis una geometría de este tipo, como es de X, tiene este simbolito de cajita, que no es exactamente igual que el de los prefabs, 48 00:03:37,000 --> 00:03:45,240 que era completamente azul, sino que tiene este precintillo. Y el problema está en que por defecto no se pueden separar los elementos. 49 00:03:45,240 --> 00:04:00,639 Yo quiero poner solo un material y no me deja aplicarlo en ocasiones. Pero hay una forma de, una vez arrastrado a la jerarquía, desempaquetar para usar independientemente los distintos elementos de un FBX. 50 00:04:00,639 --> 00:04:19,000 En este caso, si fueran otros contenedores de geometría 3D como hay, que también admiten más elementos, sería similar. Pero con clic derecho en una de estas cajitas, si vamos a prefab, porque en realidad es un prefab, aunque esté compuesto de una malla, está la opción de desempaquetar. 51 00:04:19,000 --> 00:04:41,180 Y la de desempaquetar completamente, que como dice su nombre, si os fijáis lo que hace es disgregar los elementos que tenga. Voy a borrar esto porque a lo mejor en ocasiones lo que queremos es solo eso, tener uno de los elementos. Hasta que no se desempaqueta en ocasiones, esto no se puede hacer. Aquí está apareciendo que sí, pero en ocasiones puede dar problemas. 52 00:04:41,180 --> 00:05:03,779 Hay una forma, y esto adelanta algo que veremos en el tema 5 sobre animaciones, que es que si yo quiero tener uno de los elementos del interior de un FBX, por ejemplo, independientemente, completamente independiente, antes de llegar a la jerarquía, si seleccionáis a uno y lo duplicáis, que es con CTRL-D, al dar a CTRL-D, se hace ese duplicado y ya es independiente. 53 00:05:03,779 --> 00:05:17,300 Entonces, bueno, pues lo tenéis. Para ciertos usos que ya iremos viendo y que podrían ser interesantes, desempaquetados tanto ya en la jerarquía o en el propio origen, desde el panel proyecto. 54 00:05:20,540 --> 00:05:31,139 Una cosa importante cuando vais clicando en cada uno de estos elementos es que en el inspector, como siempre sucede realmente, os va enseñando las propiedades de cada elemento y os da pista de qué es cada cosa. 55 00:05:31,139 --> 00:05:47,439 Igual que, por ejemplo, un material. Se ha introducido un poquito los materiales cuando también se habla de materiales físicos en este tema, aunque los materiales físicos habréis visto que van de otro modo, no son exactamente lo mismo, ¿vale? Podéis ir viendo qué tiene cada elemento. 56 00:05:47,439 --> 00:06:07,259 Y hay una opción importante que en ocasiones puede parecer que no está en el inspector porque puede estar recogido como ahora, que es esta parte inferior donde podéis previsualizar, por ejemplo, los modelos 3D, ¿vale? Y es muy útil, si no, desplegad estas dos líneas para arriba y es que está encogido, ¿vale? Si arrastráis veréis representaciones de las geometrías. 57 00:06:07,259 --> 00:06:28,660 Y esto es útil, por ejemplo, en esta tarea para ver por qué o qué diferencia hay aparentemente entre los dos terrenos 1, que son para el primer nivel, en el que digamos que la plataforma no se mueve en sí misma, sino que está fija, pero bueno, pues si la tenéis aquí, decir, si es lo mismo, aparentemente parece lo mismo. 58 00:06:28,660 --> 00:06:44,879 Pero si os fijáis luego, por ejemplo, en la malla que tiene cada uno, hay una versión importante, y es por lo que está hecho a propósito en esta tarea. Contiene un agujero, ¿vale? Que en uno está simplificado y en otro tiene una geometría bastante más compleja. 59 00:06:44,879 --> 00:06:54,000 ¿Vale? Entonces, bueno, alguna diferencia habrá para que estén estos dos elementos por separado, ¿no? 60 00:06:54,279 --> 00:07:02,160 Muy rápido voy a hacer un repaso a qué son las físicas en Unity, que son los componentes RigidBody y los Collider, ¿vale? 61 00:07:02,199 --> 00:07:06,300 Y cuáles son sus funciones, porque es esencial conocerlo, ¿vale? 62 00:07:06,300 --> 00:07:22,459 Pero cuando creamos una de estas primitivas, por ejemplo el cubo, por defecto vais a ver que tienen ya agregado, aparte de un mesh renderer que lo que hace es, y se asocia con este mesh que tenemos aquí, por ejemplo en este elemento, 63 00:07:22,459 --> 00:07:38,139 Un mesh renderer que está mostrando la geometría y el mesh filter que está mostrando cuál es la geometría y cómo está texturizada o qué textura, qué material tiene la geometría. 64 00:07:38,339 --> 00:07:47,560 También viene un tercer componente, dependiendo de la primitiva, será uno u otro, que es un collider de los distintos tipos que hay y que se ven en el tema. 65 00:07:47,560 --> 00:08:07,480 En los contenidos los tenéis. Si, por ejemplo, creáramos una esfera, como sucederá con la bola, pues viene con su sphere collider. Y en principio, lo borro, ¿vale? Tengo aquí una esfera que lo único que he hecho, bueno, no es lo único, voy a eliminar. Así es como vendría por defecto. Bueno, no, voy a crear otra porque si no, esta avanza demasiadas cosas. 66 00:08:08,300 --> 00:08:14,699 Cuando creo esta bola, y digo esto es una bola, creo la esfera, viene con ese Sphere Collider. 67 00:08:16,779 --> 00:08:23,480 Y fijaos, cuando tenemos Colliders, que en general, hay una excepción, pero en general, imagino que lo veis bien, 68 00:08:24,040 --> 00:08:34,620 viene, aparte de que se vea la representación de esa malla, se ve como un sólido, se ve esta mallita verde que representa lo que es el Collider. 69 00:08:34,620 --> 00:08:49,299 De hecho, si activo y desactivo el collider, veis que se marca y se desmarca, ¿vale? Bueno, no llega a desaparecer, pero veréis que se atenúa un poco el color. De hecho, si quito por completo ese collider, pues desaparece, ¿vale? 70 00:08:49,299 --> 00:09:13,580 Esto lo que significa o lo que persigue es delimitar, y son independientes, de hecho se puede mover aquí el center y veis que son independientes, es representar por un lado los límites de la geometría, que es lo que se ve mediante el mesh renderer, que es la parte visual, y luego está lo que es la parte de cómo tienen que colisionar y comportarse físicamente los objetos. 71 00:09:13,580 --> 00:09:31,500 ¿Sí? Es decir, por mucho que se vea aquí la bola, realmente no se va a sostener sobre este suelo porque la parte que es, digamos, sólida, la que percibe las colisiones, ahora mismo la tengo aquí ubicada, ¿vale? 72 00:09:31,500 --> 00:09:38,340 Las dos se mueven en conjunto, pero veis que en uno de los parámetros del collider hay un cierto desfase que le he puesto, ¿vale? 73 00:09:38,340 --> 00:09:45,980 Porque así no me puede interesar que sea más grande, que ocupe más la parte de la colisión más allá de lo que es la geometría en sí, ¿no? 74 00:09:46,799 --> 00:09:55,039 Entonces, si yo, por ejemplo, ahora esta bola, y esto es algo importante, que además viene como dos veces o más como destacado en el tema, 75 00:09:55,039 --> 00:10:15,340 Para que funcionen las colisiones en sí, tiene que haber un objeto que se mueva o que tenga comportamiento físico. Ahora mismo, en esta esfera, solo tenemos que recibir las colisiones. Pero si no hay nada que se mueva y llega a este punto, pues nada se percibe como que colisiona. 76 00:10:15,340 --> 00:10:18,500 Tengo aquí el terreno que lo he importado 77 00:10:18,500 --> 00:10:19,740 Ahora si queréis vemos también 78 00:10:19,740 --> 00:10:20,879 Cómo funciona 79 00:10:20,879 --> 00:10:23,700 Tengo este 80 00:10:23,700 --> 00:10:25,440 Que tiene otro tipo, que ahora veremos 81 00:10:25,440 --> 00:10:27,840 De Collider, que es este Mesh Collider 82 00:10:27,840 --> 00:10:28,779 Que es más avanzado 83 00:10:28,779 --> 00:10:30,519 Ahora vemos eso 84 00:10:30,519 --> 00:10:34,340 La esfera, para que tenga sus comportamientos físicos 85 00:10:34,340 --> 00:10:36,039 Está ese componente que se llama 86 00:10:36,039 --> 00:10:36,679 Rigid Body 87 00:10:36,679 --> 00:10:39,440 Y que por defecto 88 00:10:39,440 --> 00:10:42,019 Y por eso parece además que se mueve por sí solo 89 00:10:42,019 --> 00:10:43,259 Cuando reproduzcamos el juego 90 00:10:43,259 --> 00:10:45,080 tiene marcada la gravedad 91 00:10:45,080 --> 00:10:47,259 para que se use 92 00:10:47,259 --> 00:10:49,440 hay una sección 93 00:10:49,440 --> 00:10:50,759 en los project settings 94 00:10:50,759 --> 00:10:53,779 igual que veíamos el input manager 95 00:10:53,779 --> 00:10:55,639 por ejemplo, que es el de físicas 96 00:10:55,639 --> 00:10:57,740 está la física 2D, que ahora mismo no se interesa 97 00:10:57,740 --> 00:10:59,139 y las físicas 98 00:10:59,139 --> 00:11:01,159 aquí es donde se establece 99 00:11:01,159 --> 00:11:02,919 y por defecto viene la gravedad 100 00:11:02,919 --> 00:11:05,460 que en la física existe 101 00:11:05,460 --> 00:11:06,700 o es el convenio que hay 102 00:11:06,700 --> 00:11:09,139 sobrepasa un poco mis conocimientos 103 00:11:09,139 --> 00:11:11,720 pero que yo sé, y esto lo veremos en más temas 104 00:11:11,720 --> 00:11:12,840 porque es importante este número 105 00:11:12,840 --> 00:11:16,340 que corresponde con el menos 9,81, ¿vale? 106 00:11:16,620 --> 00:11:20,620 Si buscáis en internet veréis que este número, por lo que sea, que no conozco, 107 00:11:20,820 --> 00:11:23,919 está relacionado con la fuerza gravitatoria, ¿vale? 108 00:11:23,919 --> 00:11:28,059 Si en algún momento iniciáramos un juego en el que estamos en la Luna 109 00:11:28,059 --> 00:11:32,179 y queremos que la gravedad se disminuya, aquí podríamos poner el valor de gravedad de la Luna. 110 00:11:32,639 --> 00:11:35,460 Es decir, esto se puede ajustar aquí, ¿vale? 111 00:11:35,460 --> 00:11:40,259 Entre otros factores que también se habla en el tema, como este layer collision, 112 00:11:40,259 --> 00:11:53,740 Para determinar qué capas colisionan con otras independientemente, las layers son estas, lo veremos también más adelante, diferentes separaciones o segmentaciones que podemos hacer por elementos. 113 00:11:53,740 --> 00:12:19,899 Y bueno, aquí podemos hacer que unos elementos colisionen con otros, pero otros no, y así ir discriminando quién lo hace con qué. Igualmente, hay otro factor que es importante cuando ahora hablemos, que es, si os recordáis, el último día dijimos, los movimientos por el transform se hacen en el método update, 114 00:12:19,899 --> 00:12:25,419 pero los de física lo haremos con el fix update que no necesita ese time delta time del que hablábamos 115 00:12:25,419 --> 00:12:33,320 para regular la velocidad o la potencia de reproducción del ordenador 116 00:12:33,320 --> 00:12:40,120 porque aquí ya está establecido que el intervalo de ese tiempo de ejecución sea este. 117 00:12:40,940 --> 00:12:47,940 Entonces, bueno, pues son distintos elementos aparte de otros muchos que hay sobre físicas 118 00:12:47,940 --> 00:12:55,220 pero que en principio no hay que tocar porque ya viene configurado para que funcione correctamente. 119 00:12:55,519 --> 00:13:00,980 Hay algunos que sí son interesantes, pero bueno, son más avanzados, como la velocidad de penetración 120 00:13:00,980 --> 00:13:07,700 que permite, bueno, porque si una colisión es muy rápida, pues haya un tiempo de detección 121 00:13:07,700 --> 00:13:11,320 para que evite que traspase elementos por ser muy rápido, ¿vale? 122 00:13:11,419 --> 00:13:12,980 Pero bueno, vamos con lo básico. 123 00:13:13,580 --> 00:13:17,600 Cuando ponemos este RigidBody, como usa la gravedad, si le damos a Play a la reproducción, 124 00:13:17,600 --> 00:13:29,399 Vais a ver que la bola cae y atraviesa. Veis que está la bola, cae y hay un collider. Importante, porque si no hay colliders tampoco se detectan, pero hay un collider en la esfera y otro en el terreno. 125 00:13:29,759 --> 00:13:45,940 Y veis que se visualiza. ¿Por qué no lo hace? Muy simple, importante. Que porque veamos aquí un elemento y parezca que el elemento está aquí, realmente el que regula y ajusta todo lo relacionado con esas colisiones es esta malla verde que está relacionada con el collider. 126 00:13:45,940 --> 00:14:03,820 Por tanto, si la he movido y deja de estar asociada a ese elemento, pues veis que la colisión no se da como lo esperable. Ahora sí, ahora tanto la malla visual como la de colisión se ajusta y veréis que ahora cae por fuerza de la gravedad, no hay ningún código de momento que mueva esta bola y se queda ahí plantada. 127 00:14:03,820 --> 00:14:10,120 La velocidad de cómo cae, igual que sucede en el mundo 128 00:14:10,120 --> 00:14:14,679 Se regula, de momento el collider me queda ahí 129 00:14:14,679 --> 00:14:17,000 Se regula con parámetros del RigidBody 130 00:14:17,000 --> 00:14:21,360 Y lo más importante, aparte de que se puede desactivar la gravedad 131 00:14:21,360 --> 00:14:22,820 Si yo la desactivo, pues le doy a play 132 00:14:22,820 --> 00:14:26,299 Y como no hay gravedad, pues este objeto, si hubiera otra bola 133 00:14:26,299 --> 00:14:32,860 O choco hacia abajo, pues habría una colisión 134 00:14:32,860 --> 00:14:34,759 pero en sí no hay fuerza de la gravedad 135 00:14:34,759 --> 00:14:35,659 por eso no cae 136 00:14:35,659 --> 00:14:38,799 luego también veremos que hay otro que es para 137 00:14:38,799 --> 00:14:41,080 aunque tengan gravedad 138 00:14:41,080 --> 00:14:45,179 se queden fijos a la espera 139 00:14:45,179 --> 00:14:47,080 de que a lo mejor, por código digamos 140 00:14:47,080 --> 00:14:48,659 ya no es kinemático y se active 141 00:14:48,659 --> 00:14:50,360 por ejemplo en Angry Birds 142 00:14:50,360 --> 00:14:53,080 por decir un ejemplo, no es exactamente esto pero creo que 143 00:14:53,080 --> 00:14:55,299 ayuda a entenderlo, cuando tenemos un pájaro 144 00:14:55,299 --> 00:14:56,840 en el tirachín de Angry Birds 145 00:14:56,840 --> 00:14:58,379 hasta que no soltamos 146 00:14:58,379 --> 00:15:00,159 no se aplica la fuerza 147 00:15:00,159 --> 00:15:13,360 Pues a lo mejor está en kinemático hasta que de pronto decimos, vale, ya, deja de ser kinemático y usando la gravedad y todas las fuerzas que tengamos, pues ya sueltas y adquieres la fuerza física que se esté otorgando. 148 00:15:13,360 --> 00:15:16,220 entonces el RigidBody 149 00:15:16,220 --> 00:15:18,379 voy a dejarlo como viene por defecto 150 00:15:18,379 --> 00:15:19,879 que es que funcione con normalidad 151 00:15:19,879 --> 00:15:22,820 y con gravedad, están estos tres parámetros 152 00:15:22,820 --> 00:15:24,059 bien explicados en el tema 153 00:15:24,059 --> 00:15:25,299 pero que bueno, la masa 154 00:15:25,299 --> 00:15:28,179 probablemente a nivel físico 155 00:15:28,179 --> 00:15:29,559 tiene muchos peros lo que digo 156 00:15:29,559 --> 00:15:31,200 pero sería el peso 157 00:15:31,200 --> 00:15:33,899 si algo tiene una masa grande 158 00:15:33,899 --> 00:15:35,480 tiene un peso elevado 159 00:15:35,480 --> 00:15:37,679 aparte de que tenga esta masa hay otro parámetro 160 00:15:37,679 --> 00:15:38,379 otros dos 161 00:15:38,379 --> 00:15:42,360 que son el Drag y el Angular Drag 162 00:15:43,120 --> 00:15:48,320 La masa es influyente también, por ejemplo, cuando vayamos a aplicar fuerzas por código, 163 00:15:48,600 --> 00:15:52,340 como hacíamos con la nave, al darle a la W vaya hacia adelante, 164 00:15:52,919 --> 00:16:00,000 según esta masa la fuerza costará más que empuje o no, como si nosotros estuviéramos aplicando la fuerza. 165 00:16:00,440 --> 00:16:03,440 Pero hay otros dos variables, que son este drag y este angular drag, 166 00:16:03,440 --> 00:16:08,240 que son la resistencia, por un lado, al aire y la resistencia a los giros, a las rotaciones, 167 00:16:08,879 --> 00:16:12,139 que dependiendo de qué valores pongamos, si no tienen ninguna resistencia, 168 00:16:12,139 --> 00:16:22,779 Y hay vídeos que hablan de esto en el tema, que independientemente del peso o de la masa, mejor dicho, que tenga un material, lo importante es la resistencia que tenga el aire. 169 00:16:23,059 --> 00:16:34,799 Y está el experimento, supongo que lo habéis visto, del martillo y la pluma, que es en una sala en la que ninguno de los dos elementos tiene resistencia al aire, o tienen la misma, a la misma velocidad, aunque tengan distintas masas. 170 00:16:34,799 --> 00:16:48,980 Pues está este parámetro que lo que hace es, digamos, la resistencia del aire en el sentido de este aire que tenemos aquí en medio y que es invisible, cuánta resistencia, cuánta oposición al movimiento va proporcionando y por eso lo va frenando. 171 00:16:48,980 --> 00:17:00,460 ¿Vale? Veis que aunque está a la masa de 1, cae mucho más despacio y si empieza a subirlo incluso se detiene porque hay un aire aquí, hay una fuerza en el ambiente que lo detiene. 172 00:17:01,100 --> 00:17:10,019 Lo mismo sucederá con el angular drag. Esto lo veremos cuando esta bola la rotemos y esto va a suponer que la bola se detenga antes o no. 173 00:17:10,319 --> 00:17:17,200 No es la fricción de los materiales, que esos son los materiales físicos que también influyen, sino la resistencia, digamos, del ambiente, del aire. 174 00:17:17,200 --> 00:17:20,920 que no solo por subir la masa 175 00:17:20,920 --> 00:17:22,640 va a caer más rápido 176 00:17:22,640 --> 00:17:24,799 como hemos visto, todo es en conjunción 177 00:17:24,799 --> 00:17:26,980 con la resistencia que también hay en el aire 178 00:17:26,980 --> 00:17:28,480 pero sí que es importante 179 00:17:28,480 --> 00:17:30,559 por ejemplo, para aplicarle fuerza a más masa 180 00:17:30,559 --> 00:17:31,839 más cuesta mover un elemento 181 00:17:31,839 --> 00:17:34,400 a lo mejor luego se detiene antes o no 182 00:17:34,400 --> 00:17:35,779 según esta resistencia, pero también 183 00:17:35,779 --> 00:17:37,480 influye en las masas 184 00:17:37,480 --> 00:17:40,099 entonces bueno 185 00:17:40,099 --> 00:17:41,799 por defecto vais a ver que una bola 186 00:17:41,799 --> 00:17:43,660 puede caer tal que así 187 00:17:43,660 --> 00:17:45,960 además esto también es 188 00:17:45,960 --> 00:17:48,160 interesante 189 00:17:48,160 --> 00:17:52,119 porque bueno, ya vais viendo 190 00:17:52,119 --> 00:17:53,779 también motores de físicas, etcétera 191 00:17:53,779 --> 00:17:55,299 que los 192 00:17:55,299 --> 00:17:58,299 los software de modelado 3D 193 00:17:58,299 --> 00:17:59,980 tienen simuladores de físicas 194 00:17:59,980 --> 00:18:01,420 para aplicar fuerzas, etcétera, pero 195 00:18:01,420 --> 00:18:04,279 la interactividad que tenemos en Unity no es algo que teníamos 196 00:18:04,279 --> 00:18:06,099 en esos software, por tanto 197 00:18:06,099 --> 00:18:07,819 oye, se abre el abanico de 198 00:18:07,819 --> 00:18:10,240 opciones, ¿verdad? Y ojo, RigidBody 199 00:18:10,240 --> 00:18:12,180 va a ser el componente sobre el que aplicamos 200 00:18:12,180 --> 00:18:14,440 las fuerzas, es decir, si queremos que un objeto 201 00:18:14,440 --> 00:18:15,740 al darle a una tecla 202 00:18:15,740 --> 00:18:17,980 se le aplique una fuerza, ¿vale? 203 00:18:18,000 --> 00:18:20,160 Que no es lo mismo mover con el transform 204 00:18:20,160 --> 00:18:21,960 como hacíamos el otro día con el transform translate 205 00:18:21,960 --> 00:18:24,059 que es que vamos cambiando los parámetros 206 00:18:24,059 --> 00:18:26,119 como hacemos aquí, ¿vale? Esto es lo que hacemos 207 00:18:26,119 --> 00:18:28,039 con transform translate, básicamente por código 208 00:18:28,039 --> 00:18:29,740 pero hacemos esto. O 209 00:18:29,740 --> 00:18:32,059 cambiamos la escala, o cambiamos 210 00:18:32,059 --> 00:18:34,099 la rotación, ¿vale? Pero estamos 211 00:18:34,099 --> 00:18:34,960 cambiándolo en este 212 00:18:34,960 --> 00:18:38,140 componente transform. Con el RigidBody de lo que 213 00:18:38,140 --> 00:18:40,119 se trata es un poco diferente 214 00:18:40,119 --> 00:18:42,259 que es aplicar fuerzas que simulan la realidad 215 00:18:42,259 --> 00:18:43,420 ¿vale? 216 00:18:45,740 --> 00:19:11,059 Vamos a ello. Hay otro elemento muy importante, que es que aunque está todo como configurado, y vais a ver que cae la bola y choca y se queda ahí, porque no hay nada más que esté ocurriendo, no estamos dando más fuerza, entonces la bola sigue teniendo gravedad, la detiene esta tabla, porque la tabla, aunque tenga un mesh collider, no tiene un rigid body, y también esto lo pone mucho en el tema. 217 00:19:11,059 --> 00:19:28,740 Si hay un Collider, un GameObject que tiene un Collider, pero no un RigidBody, pues es una pared, es estático, no tiene comportamientos físicos. Detecta colisiones y está ahí para detenerlo. Entonces, por defecto, esto funciona como un suelo inamovible. Y lo hacemos rápido. 218 00:19:28,740 --> 00:19:31,960 Si yo le dijera que esto tenga un RigidBody 219 00:19:31,960 --> 00:19:34,880 Bueno, se lo he añadido durante el play 220 00:19:34,880 --> 00:19:38,480 Ya sabéis que durante el play lo que añadamos no funciona 221 00:19:38,480 --> 00:19:40,000 Pero si le doy a este RigidBody 222 00:19:40,000 --> 00:19:46,380 Simplemente vais a ver que se caen tanto bola como tabla 223 00:19:46,380 --> 00:19:47,380 Porque tienen la gravedad 224 00:19:47,380 --> 00:19:48,819 Si yo desactivo esta gravedad 225 00:19:48,819 --> 00:19:50,519 Y aquí vienen cosas divertidas 226 00:19:50,519 --> 00:19:53,359 La tabla no tiene gravedad 227 00:19:53,359 --> 00:19:56,000 Llega la bola y la sobrepasa 228 00:19:56,000 --> 00:19:58,140 por algo que es un poco más 229 00:19:58,140 --> 00:19:59,799 intrincado, perdona porque esto 230 00:19:59,799 --> 00:20:02,099 el MES Collider ahora hablamos, voy a poner un 231 00:20:02,099 --> 00:20:02,700 BOS Collider 232 00:20:02,700 --> 00:20:05,859 y ahora veis que tiene esa caja 233 00:20:05,859 --> 00:20:08,359 y ahora sí que cuando llegue 234 00:20:08,359 --> 00:20:10,240 estamos usando el BOS Collider, cuando llegue 235 00:20:10,240 --> 00:20:12,019 la bola, la empuja, como si fuera 236 00:20:12,019 --> 00:20:13,480 un bolo, lo habéis visto, ¿no? 237 00:20:15,220 --> 00:20:16,119 la empuja 238 00:20:16,119 --> 00:20:16,779 y 239 00:20:16,779 --> 00:20:19,519 la choca y le da, ¿vale? 240 00:20:19,519 --> 00:20:21,740 no hay gravedad pero se mueve por fuerza 241 00:20:21,740 --> 00:20:21,980 de 242 00:20:21,980 --> 00:20:25,400 el impacto y la fuerza 243 00:20:25,400 --> 00:20:26,579 que le ha transferido la bola 244 00:20:26,579 --> 00:20:29,460 entonces aquí ya podemos ir pensando en juegos 245 00:20:29,460 --> 00:20:31,259 de bolos, en juegos de lo que 246 00:20:31,259 --> 00:20:33,000 implique físicas 247 00:20:33,000 --> 00:20:35,339 voy a dejar aquí un poco aparcado esto 248 00:20:35,339 --> 00:20:37,500 del Maze Collider, que es el Collider 249 00:20:37,500 --> 00:20:39,000 que viene por defecto en estos 250 00:20:39,000 --> 00:20:41,339 FBX cuando lo arrastremos, porque es un poco 251 00:20:41,339 --> 00:20:43,319 más complejo y probablemente la parte más difícil 252 00:20:43,319 --> 00:20:45,339 de entender de la tarea, pero vamos 253 00:20:45,339 --> 00:20:47,539 a ello. ¿Qué problema hay y por qué 254 00:20:47,539 --> 00:20:49,019 y por qué no puedo 255 00:20:49,019 --> 00:20:51,259 digamos con el propósito del juego que tenemos 256 00:20:51,259 --> 00:20:53,079 y voy a decirle que esto 257 00:20:53,079 --> 00:20:54,559 sí, está bien 258 00:20:54,559 --> 00:21:08,480 ¿Qué problema hay? Que yo tengo aquí un agujerillo que voy a usar para que se meta la bola, como si fuera un campo de golf, y cuando se meta, pues ahí ha ganado la tarea, el nivel. 259 00:21:08,640 --> 00:21:14,480 ¿Qué pasa? Que los colliders por defecto son formas primitivas. Pues una caja, una esfera, una cápsula... 260 00:21:14,480 --> 00:21:27,720 ¿Y qué ocurre? Que si tengo un hueco, ahora mismo, si os fijáis, tengo una caja, pero volvemos a recordar que es independiente lo que vemos visualmente con la forma de esa caja. 261 00:21:27,720 --> 00:21:34,160 Entonces, ahora mismo, por mucho que me empeñe, y lo vamos a hacer, la bola jamás se va a meter en ese... 262 00:21:34,160 --> 00:21:41,079 ¡Uy va! A ver, voy a quitarle el Rigid Body, ¿vale? Porque no quiero que el terreno se mueva, entonces me está molestando más que otra cosa. 263 00:21:41,500 --> 00:21:44,900 Quiero que teste la colisión y la bola, pues, choque con ello o no. 264 00:21:45,440 --> 00:21:52,440 Cuando llega la bola, se posa ahí, y bueno, aparte de que la bola no la ajusta de tamaño y no va a entrar, pues porque es un poquito grande, ¿vale? 265 00:21:52,440 --> 00:22:06,539 Voy a cambiar la escala, vinculo todo para que se escale proporcional, 0,2, y ahora, a ver, voy a hacerla un poquito más, la voy a ajustar más, ¿vale? Ahora ya sí tiene un tamaño para que se pueda introducir, ¿vale? 266 00:22:06,539 --> 00:22:21,119 Si yo meto esta bola y estamos en reproducción, podemos comprobar las simulaciones de físicas moviendo los elementos, que cuando soltemos o vayamos operando, subo la bola y cuando suelto, como tiene gravedad, baja. 267 00:22:21,119 --> 00:22:32,940 Esto en tiempo real, en el panel escena, podemos siempre ir testeando y fijaos que cuando se cae, suelto y se cae, porque ahí no hay nada. Reseteo otra vez. 268 00:22:32,940 --> 00:22:48,640 ¿Qué sucede? Si os fijáis, el primer problema, que cuando yo me pongo encima de este agujero, digo, pero si hay un agujero, ¿vale? Pero lo he dicho, no se está metiendo, aunque lo ponga ahí, se queda flotando, porque el collider del terreno es un cubo. 269 00:22:48,640 --> 00:23:06,940 Entonces, por eso esta tarea, para huecos, vacíos, geometrías complejas, si queremos que se adapte completamente, existe este otro tipo de collider, que es el que suele venir con los FBX, porque son, se entiende, geometrías más complejas que se adaptan a mallas, ¿vale? 270 00:23:06,940 --> 00:23:36,839 Entonces, bueno, ahí pues hay un elemento extra que tener en juego, que es que los colliders también se van, hay distintas tipologías y unos son más complejos que otros y el BOS Collider a nivel de recursos además consume muy poco y el MES Collider, pues si metemos geometrías, consume más y de hecho, lo pone en el tema, si tiene una geometría vinculada o esa malla, ese collider consistente en malla tiene más de un número de polígonos, 256 de hecho, 271 00:23:36,940 --> 00:23:42,319 pues esta malla se simplifica o empieza a tener comportamientos no deseados. 272 00:23:42,759 --> 00:23:47,200 Por eso también, quizá, es la razón por la que os he proporcionado una malla 273 00:23:47,200 --> 00:23:52,779 que veis que tiene pocos triángulos, con respecto a la de alto poligonaje, 274 00:23:52,880 --> 00:23:57,059 que es la que queremos que se vea, que sobrepasa ese número de triángulos. 275 00:23:57,740 --> 00:24:03,339 Y en realidad, cuando tenemos un collider, ¿qué más me da que haya toda esta geometría? 276 00:24:03,640 --> 00:24:06,420 Si lo que quiero es que detecte, pues oye, que hay un agujero. 277 00:24:06,420 --> 00:24:08,160 tampoco tiene que ser 100% 278 00:24:08,160 --> 00:24:10,579 realista 279 00:24:10,579 --> 00:24:12,640 es decir, no se va a percibir cuando la gambola 280 00:24:12,640 --> 00:24:14,519 se cae si hay un poquito, visualmente 281 00:24:14,519 --> 00:24:16,380 sí, porque los acabados son más finos 282 00:24:16,380 --> 00:24:18,519 las curvas, los biseles, pero a nivel 283 00:24:18,519 --> 00:24:20,539 de Collider, no, por eso 284 00:24:20,539 --> 00:24:22,480 se sacan estas versiones de 285 00:24:22,480 --> 00:24:24,559 más bajo poligonaje, para no sobrecargar 286 00:24:24,559 --> 00:24:26,539 porque al final las físicas tienen 287 00:24:26,539 --> 00:24:28,519 muchos cálculos detrás y para 288 00:24:28,519 --> 00:24:30,759 no sobrecargar la máquina, pues se optimiza 289 00:24:30,759 --> 00:24:31,539 de este modo, ¿vale? 290 00:24:32,740 --> 00:24:33,180 Entonces 291 00:24:33,180 --> 00:24:36,140 nos hemos quedado en la bola 292 00:24:36,140 --> 00:25:01,599 Y hay otro comportamiento muy importante, muy, muy, muy, muy, muy, muy importante, digo muchos muy, porque es uno de los quebraderos de cabeza que hay al principio cuando interactuamos a través de colliders, que es que un collider, digamos, y todos, sucede, bueno, en el mes collider, sí, también sucede, pero con asterisco, todos los colliders van a tener un parámetro desactivado por defecto, que es este del isTrigger. 293 00:25:01,599 --> 00:25:10,200 Están en modo colisión, que el collider funciona como un colisionador 294 00:25:10,200 --> 00:25:11,640 Que es lo que hay ahora mismo 295 00:25:11,640 --> 00:25:15,039 Y tenemos esta bola y choca con el terreno 296 00:25:15,039 --> 00:25:18,240 Que si os fijáis tampoco tiene marcado esto East Trigger 297 00:25:18,240 --> 00:25:21,380 Pero hay que pensar que en ocasiones 298 00:25:21,380 --> 00:25:23,579 Y es otro de los usos que tienen los colliders 299 00:25:23,579 --> 00:25:28,559 Es que gracias a estas áreas verdes asociadas con el collider 300 00:25:28,559 --> 00:25:30,160 Estas áreas que tenemos aquí 301 00:25:30,160 --> 00:25:33,039 que no tienen ni por qué ir asociadas a una malla 302 00:25:33,039 --> 00:25:34,220 yo puedo desactivar esta malla 303 00:25:34,220 --> 00:25:36,740 y si este GameObject solo, de hecho mirad 304 00:25:36,740 --> 00:25:38,299 yo puedo añadir aquí 305 00:25:38,299 --> 00:25:40,700 un Entity, no tiene nada 306 00:25:40,700 --> 00:25:42,740 y decir yo quiero que esto tenga un Boss Collider 307 00:25:42,740 --> 00:25:45,180 aunque no se vea nada, aquí hay un Boss Collider 308 00:25:45,180 --> 00:25:47,059 y fijaos que hay una caja ahí 309 00:25:47,059 --> 00:25:49,140 voy a resetear la posición porque me la he llevado 310 00:25:49,140 --> 00:25:51,400 un poco lejos, tengo aquí un Boss Collider 311 00:25:51,400 --> 00:25:52,720 y 312 00:25:52,720 --> 00:25:56,380 ahí está, un cubo 313 00:25:56,380 --> 00:25:57,740 que no se ve, pero hay 314 00:25:57,740 --> 00:26:00,460 un área que sirve para cosas 315 00:26:00,460 --> 00:26:02,400 O está ahí para algo 316 00:26:02,400 --> 00:26:04,200 Como esto tiene un Bosch Collider 317 00:26:04,200 --> 00:26:05,700 No se ve ningún cubo 318 00:26:05,700 --> 00:26:07,299 Pero fijaos que cuando yo dé a la bola 319 00:26:07,299 --> 00:26:10,559 La bola se queda ahí encima 320 00:26:10,559 --> 00:26:14,579 Esto de primeras no es nada intuitivo 321 00:26:14,579 --> 00:26:16,000 Pero es lo que os he contado 322 00:26:16,000 --> 00:26:19,299 Un Collider sirve para detectar colisiones 323 00:26:19,299 --> 00:26:21,400 Y comportarse como un límite natural 324 00:26:21,400 --> 00:26:24,339 A lo que un Rigidbody se enfrenta 325 00:26:24,339 --> 00:26:26,980 Este Rigidbody está intentando seguir bajando 326 00:26:26,980 --> 00:26:27,940 Por fuerza de la gravedad 327 00:26:27,940 --> 00:26:30,039 Y dices, si que ahí no hay nada 328 00:26:30,039 --> 00:26:48,619 Vale, efectivamente no hay nada, pero hay un collider y como tal se está detectando y está funcionando acorde a ello. ¿Qué sucede? Que los colliders tienen otro uso y este además me viene muy bien. Tienen otro uso que es delimitar áreas para que sucedan cosas. Y el ejemplo lo pongo ahora muy rápido. 329 00:26:48,619 --> 00:26:54,779 Imaginaos que yo quiero, y esta es la lógica que tenéis que meteros en la cabeza 330 00:26:54,779 --> 00:26:59,839 Que es cuando yo llegue con la pelota, consiga que la pelota se meta en este agujero 331 00:26:59,839 --> 00:27:04,779 Vamos a tener que decirle al programa de alguna forma que cuando la pelota se meta aquí 332 00:27:04,779 --> 00:27:09,039 Se active un código o sucede algo que nos pase al siguiente nivel 333 00:27:09,039 --> 00:27:14,259 O que saliera una pantalla que diga ha superado el nivel o lo que sea 334 00:27:14,259 --> 00:27:15,880 Pero que active algo, que detecte algo 335 00:27:15,880 --> 00:27:29,140 Para eso se usan los colliders también, solo que en vez de usarlo en modo colisión, porque aquí vamos a querer que la bola se meta y aunque haya un límite, imaginaos que este cubo lo muevo y lo meto aquí dentro. 336 00:27:29,920 --> 00:27:39,440 Queremos que la bola se meta ahí, pero que haya un área definida que no sirva, que no funcione como un límite físico, 337 00:27:40,000 --> 00:27:47,339 pero sí sirva para detectar que algo, cuando traspasa sus límites o se mete en su interior, pueda desencadenar eventos, puede desencadenar acciones. 338 00:27:48,339 --> 00:27:51,279 Para eso está esto de Eastrigger, y son excluyentes. 339 00:27:51,279 --> 00:28:11,400 Si yo tengo un non-collider así, el software sí va a detectar que está chocando con los límites y, entre otras cosas, lo que hace es que no permite que lo atraviese. Va a haber un método en código que permita detectar estas colisiones físicas, digamos, yo lo llamo así, en plan que respetan los límites físicos de este cubo, en este caso. 340 00:28:11,400 --> 00:28:13,640 si yo en el cubo 341 00:28:13,640 --> 00:28:15,720 no en la bola, en el cubo, porque yo la bola 342 00:28:15,720 --> 00:28:17,579 quiero que cuando siga 343 00:28:17,579 --> 00:28:19,119 si yo la dejara aquí 344 00:28:19,119 --> 00:28:21,539 y la sacara de esta caja y le doy al play 345 00:28:21,539 --> 00:28:24,019 yo no quiero, yo quiero que se siga comportando 346 00:28:24,019 --> 00:28:25,460 con algo físico que tiene límites 347 00:28:25,460 --> 00:28:26,740 pero 348 00:28:26,740 --> 00:28:30,019 sin embargo, este cubo 349 00:28:30,019 --> 00:28:31,779 ahora mismo yo no quiero que tenga 350 00:28:31,779 --> 00:28:33,059 un comportamiento físico 351 00:28:33,059 --> 00:28:35,599 se podría buscar por algún 352 00:28:35,599 --> 00:28:37,720 motivo, pero 353 00:28:37,720 --> 00:28:40,059 este cubo 354 00:28:40,059 --> 00:29:00,420 Lo que quiero es que cuando detecte que se ha metido una bola puedan lanzarse estos sucesos. Si yo a este cubo le digo, no, no, tú no vas a funcionar como un collider, vas a funcionar como un trigger. Trigger en inglés significa disparador. Sirve para lanzar, para servir de excusa, digamos, de detector de acciones. 355 00:29:01,079 --> 00:29:10,059 Vais a ver que el primer efecto que tiene es que cuando doy a play, a nivel físico, no está ahí. 356 00:29:10,059 --> 00:29:12,240 Es como si no existiera, lo ha atravesado. 357 00:29:12,619 --> 00:29:18,119 Pero ojo, que el programa sí ha detectado a nivel interno, de momento, que esta bola ha entrado en esta área. 358 00:29:18,460 --> 00:29:24,559 Y eso es lo que haremos cuando de hecho cojamos y usemos un collider, en este caso un boss collider, 359 00:29:25,119 --> 00:29:28,920 porque de esta forma no viene bien, que vamos a hacer más pequeñito. 360 00:29:28,920 --> 00:29:50,930 Vamos a decirle que esto sea de 0,1 en todas las dimensiones. Un cubito, ¿vale? Que lo que vamos a hacer es meterlo aquí dentro y ahí va a estar. A ver, GameObject, lo vamos a llamar detector, bueno, trigger o como queramos, o meta. Vamos a decir que esto es meta, ¿vale? 361 00:29:50,930 --> 00:30:03,670 Y esto, como trigger que es, va a estar aquí esperando a que alguien lo atraviese o lo toque o lo que sea, pero en ningún momento va a suponer una resistencia física. Simplemente va a servir de disparador, de trigger. 362 00:30:03,670 --> 00:30:32,769 Vale, y voy a llamarlo ahora Disparador. Bueno, no, Disparador no. Sucesos Collider, yo qué sé. Porque voy a enseñaros, también viene el tema, que hay dos métodos, bueno, en realidad hay más, pero hay como dos métodos base, que sirven para trabajar con estas colisiones o con estos triggers, ¿vale? 363 00:30:33,650 --> 00:30:46,490 Imaginaos, yo voy a generar un script que se va a llamar, y lo hago aquí durante el tutorial, que se va a llamar sucesos también, collider, yo que sé, que mata, ¿vale? 364 00:30:46,490 --> 00:30:59,730 Y lo voy a asociar a este cubo transparente, visualmente, pero que tiene este collider, ¿vale? Para que sucedan cosas. Abro este código y aquí está, preparado para trabajar, ¿vale? 365 00:30:59,730 --> 00:31:14,089 Este es el objeto que yo quiero que capte lo que va a ocurrir. También se podría poner a la bola lo que vamos a ir viendo, pero hay que ir midiendo a quién se le pone según quién dispara qué o quién tiene ciertas acciones, ¿vale? 366 00:31:14,089 --> 00:31:32,789 Hay dos métodos, y esto es importante con respecto a algunas de las tareas, no en general, pero de las tareas, que es que penséis siempre que estas llaves engloban, y hablábamos del encapsulamiento en su momento, engloban acciones que se dan en ciertos momentos o que recopilan acciones cuando creábamos un método, etc. 367 00:31:32,789 --> 00:31:54,950 Cuando vamos generando nuevas, imaginaos que yo hago el método, voy a saltar o impacto como en la tarea número uno. Hay que tener bien en cuenta dónde lo declaramos. Es decir, si lo declaramos dentro del update, realmente no se está llamando en ningún momento y se está ejecutando dentro del update. 368 00:31:54,950 --> 00:32:08,769 No es el punto, de hecho pone error. Hay que hacerlo fuera de los tiempos de ejecución, que luego ya cada fotograma, si lo metemos en la date, llamaremos a impacto y ahí buscará el método fuera de estas llaves. 369 00:32:09,130 --> 00:32:18,930 Es un método independiente que se llama impacto y hará lo que tenga que hacer. Lo mismo va a suceder con estos que voy a indicar ahora, que se declaran fuera de los tiempos de ejecución. 370 00:32:18,930 --> 00:32:40,869 Siempre dentro de la clase, ¿vale? Pero como otro método aparte. Esos métodos son los onTrigger, ¿vale? Y vais a ver que luego tienen distintos apellidos, que son el enter, el exit, el stay. Por ejemplo, el enter lo voy a poner aquí. Y tiene muchas cosas, mucha parafernalia ya escrita, ¿vale? Importante que esté esa parafernalia, porque si no, no funciona bien. 371 00:32:40,869 --> 00:33:01,369 Por tanto, cuando pongáis un trigger, dadle a la que queráis, doble clic, que se os crea ya ese método. Alguien ya lo ha creado por vosotros, ¿vale? En alguna de estas librerías, bueno, el MonoBehavior, está este comportamiento de onTrigger, ¿vale? Y de hecho está en Unity Engine, está dentro de esta biblioteca. 372 00:33:01,369 --> 00:33:04,049 ¿vale? y por otro lado 373 00:33:04,049 --> 00:33:06,029 lo pongo, ahora vamos discriminando 374 00:33:06,029 --> 00:33:08,009 están los on collision, que también tienen las mismas 375 00:33:08,009 --> 00:33:09,970 etiquetas, enter, exit y stay 376 00:33:09,970 --> 00:33:12,150 la forma más rápida en este 377 00:33:12,150 --> 00:33:14,230 momento para asociarlo con que es esto de 378 00:33:14,230 --> 00:33:16,150 enter, stay 379 00:33:16,150 --> 00:33:18,069 o exit, es lo mismo que hablamos 380 00:33:18,069 --> 00:33:19,849 de cuando usábamos los 381 00:33:19,849 --> 00:33:21,990 input.getkey, que estaba 382 00:33:21,990 --> 00:33:24,190 el getkey down, el getkey up o el getkey 383 00:33:24,190 --> 00:33:26,089 a secas, que dependía de 384 00:33:26,089 --> 00:33:27,769 en el momento en el que se pulsa 385 00:33:27,769 --> 00:33:30,089 si se mantiene la tecla pulsada o si 386 00:33:30,089 --> 00:33:36,569 se suelta y en ese momento es cuando se producía el efecto aquí es un poco igual nosotros imaginaos 387 00:33:36,569 --> 00:33:41,329 que tengo el trigger vale porque esto es un trigger vamos a poder lanzar acciones según 388 00:33:41,329 --> 00:33:48,089 si un objeto el que sea ya veremos que luego gracias a este parámetro podremos incluso 389 00:33:48,089 --> 00:33:54,569 discriminar a qué objeto lanza el trigger y qué objetos no vale pero vamos paso a paso cuando un 390 00:33:54,569 --> 00:34:13,809 Si un objeto atraviesa, entra, mejor dicho, por eso es Enter, este trigger, que es el que tiene este script, y por eso sucede, al tocarlo se activará o se hará lo que ponga aquí. 391 00:34:13,809 --> 00:34:43,449 Por ejemplo, si yo tuviera otro método aquí llamado impacto, lo pongo aquí, lo creo y le pongo el void pertinente y digo cuando un objeto, vamos a hacer la prueba inmediatamente de si esto funciona o no, si yo pongo que impacto, ahí está preparado, aquí es como otro tiempo de ejecución, pero dependiente de, oye, esto ha entrado un elemento en el trigger. 392 00:34:43,809 --> 00:34:52,750 vale vamos a decirle que cuando entre por ejemplo esta bola en este en este cubo que tenemos aquí 393 00:34:52,750 --> 00:34:59,230 que es trigger que es de tipo trigger lo tenemos marcado si no fuera trigger estaríamos usando este 394 00:34:59,230 --> 00:35:03,989 otro vale son dos diferentes que se lancen lo que pone el impacto y en impacto voy a poner un 395 00:35:03,989 --> 00:35:10,829 debate lo como siempre la forma más rápida de comprobar que sucede algo que es trigger activado 396 00:35:10,829 --> 00:35:14,349 activado, ¿vale? lo guardo 397 00:35:14,349 --> 00:35:15,769 ¿qué sucederá? 398 00:35:16,230 --> 00:35:17,050 ¿vale? que cuando 399 00:35:17,050 --> 00:35:20,010 este objeto detecte que le han entrado 400 00:35:20,010 --> 00:35:21,989 en su trigger, pues va a 401 00:35:21,989 --> 00:35:23,969 ejecutar lo que hay dentro, que en este caso nos lleva a 402 00:35:23,969 --> 00:35:25,150 que la consola muestre 403 00:35:25,150 --> 00:35:27,969 trigger en activado 404 00:35:27,969 --> 00:35:29,670 lo he guardado, le doy a play 405 00:35:29,670 --> 00:35:31,690 voy a poner la bolica un poco más arriba 406 00:35:31,690 --> 00:35:33,989 para que se vea que tarda un poco 407 00:35:33,989 --> 00:35:35,630 y que según entra en el trigger 408 00:35:35,630 --> 00:35:38,170 y una sola vez 409 00:35:38,170 --> 00:35:39,909 ¿vale? trigger 410 00:35:39,909 --> 00:35:49,309 activado. Esto imaginaos en la tarea de los obstáculos de la nave, que cuando la nave toque ese obstáculo, ya por código 411 00:35:49,309 --> 00:36:03,869 podríamos decir que el propio pivote, el obstáculo, se destruya. En vez de hacerlo con esa condición de si sobrepasa tal 412 00:36:03,869 --> 00:36:07,849 profundidad se desactive, etc., ya se podría hacer directamente con el trigger. 413 00:36:08,429 --> 00:36:12,210 Y de hecho, ahora en vez de, aparte de que ponga 414 00:36:12,210 --> 00:36:14,969 debug log en impacto, voy a hacer que se destruya 415 00:36:14,969 --> 00:36:19,809 a sí mismo. Cuando ponemos gameObject así con minúscula, significa 416 00:36:19,809 --> 00:36:23,650 que estamos hablando del propio objeto que tiene este código. 417 00:36:24,369 --> 00:36:27,909 Vais a ver ahora que lo que va a conseguir es que cuando 418 00:36:27,909 --> 00:36:31,650 esta bola, y veréis que en todo momento 419 00:36:31,650 --> 00:36:34,130 estaba atravesando la caja, es un trigger 420 00:36:34,130 --> 00:36:35,949 recordad, no hay límites físicos 421 00:36:35,949 --> 00:36:38,070 sirve para detectar que algo entra 422 00:36:38,070 --> 00:36:39,989 o permanece si usa el state o sale 423 00:36:39,989 --> 00:36:41,510 si es el exit, veis 424 00:36:41,510 --> 00:36:42,909 y no sé si os habéis fijado 425 00:36:42,909 --> 00:36:45,889 que lo que hace, fijaos en este que es el que tiene el script 426 00:36:45,889 --> 00:36:47,170 que dice, destruyeme a mi 427 00:36:47,170 --> 00:36:49,250 si algo me entra en mi trigger 428 00:36:49,250 --> 00:36:51,849 al darle a play, fijaos que 429 00:36:51,849 --> 00:36:53,849 lo ha destruido el GameObject 430 00:36:53,849 --> 00:36:55,789 vale, aquí ya 431 00:36:55,789 --> 00:36:57,909 es lo que queramos poner en este 432 00:36:57,909 --> 00:36:59,710 interior, ya 433 00:36:59,710 --> 00:37:02,269 lo que vayamos sabiendo, ya vamos detectando 434 00:37:02,269 --> 00:37:05,909 pues eso, que 435 00:37:05,909 --> 00:37:10,050 acciones que se desencadenan con este evento 436 00:37:10,050 --> 00:37:12,110 voy a hacer otra cosa, voy a quitar esto del destroy 437 00:37:12,110 --> 00:37:14,090 que me servía de ejemplo, que en vez de poner 438 00:37:14,090 --> 00:37:16,050 onTriggerEnter, uso 439 00:37:16,050 --> 00:37:16,849 otro de los 440 00:37:16,849 --> 00:37:19,710 de los onTrigger que había, que es el 441 00:37:19,710 --> 00:37:21,489 onTriggerStay 442 00:37:21,489 --> 00:37:23,849 es decir, stay de permanecer, esto 443 00:37:23,849 --> 00:37:26,170 va a ser igual que cuando poníamos el getKey 444 00:37:26,170 --> 00:37:27,789 sin down o up, vale 445 00:37:27,789 --> 00:37:30,809 el trigger state va a ir 446 00:37:30,809 --> 00:37:32,909 ejecutándose en cada 447 00:37:32,909 --> 00:37:34,949 fotograma que esté el objeto 448 00:37:34,949 --> 00:37:36,510 dentro, pues la orden 449 00:37:36,510 --> 00:37:38,449 en un modo, como una especie de update 450 00:37:38,449 --> 00:37:40,909 pero relacionado con esto que estamos 451 00:37:40,909 --> 00:37:42,789 hablando hoy, vale, si yo aquí pongo state 452 00:37:42,789 --> 00:37:44,849 pues lo que vais a ver 453 00:37:44,849 --> 00:37:46,869 es que ahora impacto puesto, muestra 454 00:37:46,869 --> 00:37:48,909 este mensaje de trigger activado, ahora en vez de 455 00:37:48,909 --> 00:37:50,690 solo mostrarlo cada vez 456 00:37:50,690 --> 00:37:52,610 y solo ese fotograma que se mete 457 00:37:52,610 --> 00:37:54,849 el otro 458 00:37:54,849 --> 00:37:56,650 elemento en ese 459 00:37:56,650 --> 00:37:59,030 GameObject, vais a ver 460 00:37:59,030 --> 00:38:00,829 que va a lanzar ese mensaje múltiples veces 461 00:38:00,829 --> 00:38:02,969 porque en todo rato, y veis que 462 00:38:02,969 --> 00:38:04,929 todo rato 463 00:38:04,929 --> 00:38:05,510 que se esté 464 00:38:05,510 --> 00:38:08,250 ese elemento dentro 465 00:38:08,250 --> 00:38:10,949 de la caja, se va a 466 00:38:10,949 --> 00:38:12,409 seguir, y aquí sigue contando 467 00:38:12,409 --> 00:38:14,590 lanzando ese mensaje 468 00:38:14,590 --> 00:38:16,750 si yo muevo la bola y la saco 469 00:38:16,750 --> 00:38:18,730 fijaos que ahora la he sacado, en el momento 470 00:38:18,730 --> 00:38:20,690 en el que no está dentro, ya no se está lanzando 471 00:38:20,690 --> 00:38:22,650 fijaos que en cuanto 472 00:38:22,650 --> 00:38:23,869 vuelvo a entrar aquí 473 00:38:23,869 --> 00:38:26,590 otra vez se activa, porque 474 00:38:26,590 --> 00:38:28,389 estamos dentro, un trigger state. 475 00:38:29,090 --> 00:38:34,750 Esto imaginaos que entráis en un área de un juego en el que cuando entras en una habitación 476 00:38:34,750 --> 00:38:39,730 tiene que haber un peligro y se activa una luz y el enemigo es más fiero, ¿vale? 477 00:38:40,130 --> 00:38:44,809 Pues se podría delimitar que haya un trigger, un collider, como East Trigger, 478 00:38:45,389 --> 00:38:48,590 dentro de esa área y que detecte que cuando entra tal personaje y esté dentro, 479 00:38:48,590 --> 00:38:50,070 pues está en ese modo alerta. 480 00:38:50,489 --> 00:38:55,090 Cuando sale, es decir, cuando ya no está dentro, pues se desactiva. 481 00:38:55,090 --> 00:38:57,110 existe otro que es el exit 482 00:38:57,110 --> 00:38:58,349 que es un poco lo mismo 483 00:38:58,349 --> 00:39:00,889 ¿vale? está ahí 484 00:39:00,889 --> 00:39:03,150 es el tercero, que es cuando sale 485 00:39:03,150 --> 00:39:04,889 ¿vale? no pone nada 486 00:39:04,889 --> 00:39:07,190 a ver, vale, bueno, hay un problema 487 00:39:07,190 --> 00:39:08,070 aquí seguramente 488 00:39:08,070 --> 00:39:11,269 y esto cuidado también porque es 489 00:39:11,269 --> 00:39:13,269 importante, que es que los 490 00:39:13,269 --> 00:39:15,250 triggers, atención, que si yo 491 00:39:15,250 --> 00:39:17,309 lo metiera aquí, pues básicamente 492 00:39:17,309 --> 00:39:19,510 está todo el rato 493 00:39:19,510 --> 00:39:20,809 tocando a otro elemento, ¿vale? 494 00:39:21,230 --> 00:39:22,909 que estamos hablando todo el rato de la bola 495 00:39:22,909 --> 00:39:24,510 pero si esto también tiene un collider 496 00:39:24,510 --> 00:39:31,929 y por eso está lo de la matriz que os hablé antes, también entre otras herramientas, pues estaría todo el rato detectando algo. 497 00:39:32,570 --> 00:39:43,730 Si yo, vamos a ver, si yo dejo la caja bien ajustadica para que no toque nada y pongo la bola que cuando entre, 498 00:39:46,900 --> 00:39:52,519 es que está detectando que sale en todo momento y de todos modos, a ver, porque no está haciendo el comportamiento, 499 00:39:52,519 --> 00:39:54,119 Vale, es que no había guardado 500 00:39:54,119 --> 00:39:56,880 Que eso, tened en cuenta que hay muchos tipos 501 00:39:56,880 --> 00:39:59,139 Muchos triggers, que no solo es uno 502 00:39:59,139 --> 00:40:00,519 Hay que discriminarlo cuál sería 503 00:40:00,519 --> 00:40:03,320 Ahora, la bola no se lanza 504 00:40:03,320 --> 00:40:04,940 Ningún mensaje hasta que la esfera 505 00:40:04,940 --> 00:40:06,880 Sale, ha salido 506 00:40:06,880 --> 00:40:08,559 Y trigger activado, se ha lanzado 507 00:40:08,559 --> 00:40:10,420 El mensaje cuando 508 00:40:10,420 --> 00:40:12,719 Bueno, pues cuando ha salido 509 00:40:12,719 --> 00:40:14,480 La instrucción que estamos dando, ¿vale? 510 00:40:14,840 --> 00:40:16,659 Eso solo son triggers, pensad que son 511 00:40:16,659 --> 00:40:18,840 Pues por ejemplo, ponerlo 512 00:40:18,840 --> 00:40:20,699 Para cuando atravesamos una puerta que detecte 513 00:40:20,699 --> 00:40:26,099 que pasamos esa puerta o que cuando cualquier cosa vale con gracias a los colliders podemos 514 00:40:26,099 --> 00:40:33,059 seguir determinando áreas y dibujando áreas vale qué sucede con el otro que tenemos por aquí que 515 00:40:33,059 --> 00:40:41,039 existe otro método vale que también es versátil que es ir a borrar el on trigger de momento bueno 516 00:40:41,039 --> 00:40:45,400 no lo voy a dejar ahí que como no vamos a poner nada no hace nada que es este on collision vale 517 00:40:45,400 --> 00:40:48,019 que también la lógica no la voy a aplicar porque es la misma, 518 00:40:48,980 --> 00:40:52,760 Enter, Stay o Exit, que es cuando choque con ese objeto. 519 00:40:53,059 --> 00:40:57,679 Es decir, yo ahora mismo vais a ver que la bola se queda suspendida. 520 00:40:57,679 --> 00:40:59,579 Bueno, espera, porque igual la he movido. 521 00:41:01,400 --> 00:41:05,860 Lo primero es que para que suceda esto del OnCollisionEnter, 522 00:41:06,880 --> 00:41:10,300 como hemos dicho, no puede ser modo IsTrigger. 523 00:41:11,219 --> 00:41:12,460 Son excluyentes. 524 00:41:12,460 --> 00:41:35,039 Puede ser o modo collider físico o modo trigger disparador. Si lo quito, vais a ver que la bola ahora sí se queda suspendida. Lanzará un mensaje, y ahora mismo no lo hace porque nuevamente no ha guardado, pero si ponemos on collision enter significa que en cuanto otro objeto colisione, no trigger, colisione, tiene que estar sin el trigger activado. 525 00:41:35,039 --> 00:41:37,159 colisione con este objeto, ese fotograma 526 00:41:37,159 --> 00:41:38,320 del contacto, el primero 527 00:41:38,320 --> 00:41:41,300 se lanzará el mensaje, vais a ver que en cuanto choque 528 00:41:41,300 --> 00:41:42,000 PLAS 529 00:41:42,000 --> 00:41:45,079 bueno, pues PLAS no, esperad un segundo 530 00:41:45,079 --> 00:41:49,360 collision enter, impacto 531 00:41:49,360 --> 00:41:51,420 trigger activado 532 00:41:51,420 --> 00:41:52,579 ¿por qué no lo hace? a ver 533 00:41:52,579 --> 00:41:55,199 no he guardado y seguramente sea eso 534 00:41:55,199 --> 00:41:58,360 ¿vale? en cuanto choque 535 00:41:58,360 --> 00:41:59,619 trigger activado 536 00:41:59,619 --> 00:42:02,380 ¿vale? bueno, pero veis que sigue 537 00:42:02,380 --> 00:42:04,599 manteniendo la lógica de 538 00:42:04,599 --> 00:42:06,460 contacto físico 539 00:42:06,460 --> 00:42:08,800 si aquí en vez de decirle 540 00:42:08,800 --> 00:42:11,019 collision enter, digo on collision 541 00:42:11,019 --> 00:42:11,820 stay 542 00:42:11,820 --> 00:42:14,800 es todo momento 543 00:42:14,800 --> 00:42:16,119 digamos que esté tocando 544 00:42:16,119 --> 00:42:18,920 que estén contactando 545 00:42:18,920 --> 00:42:20,500 colisionando los dos objetos 546 00:42:20,500 --> 00:42:22,039 se lanzará el mensaje 547 00:42:22,039 --> 00:42:23,980 ¿vale? y ya veis que 548 00:42:23,980 --> 00:42:25,739 en cuanto está ahí 549 00:42:25,739 --> 00:42:28,380 aquí trigger activado 550 00:42:28,380 --> 00:42:30,800 por algún momento está dejando de detectarlo 551 00:42:30,800 --> 00:42:32,440 en algún momento ¿vale? 552 00:42:32,440 --> 00:42:56,860 Porque también tener en cuenta, y esto también es importante, que aparte de que se pueden limitar los contactos, etc., cuando tienes geometrías irregulares, y una esfera en cierto modo lo es, puede que haya momentos que se mueva por física alguna de las geometrías de estos detectores y ya no esté rozando, ¿vale? 553 00:42:56,860 --> 00:43:11,900 Pero bueno, veis que va lanzando de distinto mensaje mientras nota que está colisionando. Como las colisiones se entiende que se colisionan, chocan y no suelen quedarse pegados, pues no funciona tan bien, pero también se podría hacer. 554 00:43:11,900 --> 00:43:26,840 También es verdad que hay ocasiones que la gravedad cuando choca en el rebote ya deja de estar completamente alineada, pero la lógica es esa. Y el exit es lo mismo, pero cuando deja de colisionar. 555 00:43:26,860 --> 00:43:42,489 Guardo. Vais a ver que no se lanza mensaje hasta que lo mueva y se deja de colisionar. Otro. Muevo. Lo veis, ¿no? Esto ya abre, creo, un mundo de posibilidades. 556 00:43:42,489 --> 00:43:45,309 problemas que tiene esto 557 00:43:45,309 --> 00:43:46,829 o conflictos que puede surgir 558 00:43:46,829 --> 00:43:51,070 si estamos usando estos colliders 559 00:43:51,070 --> 00:43:53,449 que forman dentro del 560 00:43:53,449 --> 00:43:54,449 ámbito de la física 561 00:43:54,449 --> 00:43:59,170 se puede hacer, pero existirán 562 00:43:59,170 --> 00:44:01,210 problemas si los objetos 563 00:44:01,210 --> 00:44:03,230 los movemos mediante el transform como sabemos 564 00:44:03,230 --> 00:44:05,510 ahora y queremos que 565 00:44:05,510 --> 00:44:07,530 también reaccionen 566 00:44:07,530 --> 00:44:09,329 a las leyes de la física y a los colliders 567 00:44:09,329 --> 00:44:11,190 ¿esto qué significa? igual que hemos visto 568 00:44:11,190 --> 00:44:13,070 ese problema de que la bola se posa 569 00:44:13,070 --> 00:44:14,829 y en cierto momento deja de detectar 570 00:44:14,829 --> 00:44:17,190 ese contacto, si yo la bola 571 00:44:17,190 --> 00:44:19,050 aunque ahora lo estoy haciendo así a la brava 572 00:44:19,050 --> 00:44:21,210 con el transform, por tanto me desdigo un poco 573 00:44:21,210 --> 00:44:22,909 puede haber problemas porque 574 00:44:22,909 --> 00:44:25,230 cuando movemos los objetos mediante 575 00:44:25,230 --> 00:44:26,730 el transform 576 00:44:26,730 --> 00:44:29,030 pueden no estar, ahora hay una inercia 577 00:44:29,030 --> 00:44:30,929 por eso se está moviendo la bola, porque empuja y 578 00:44:30,929 --> 00:44:32,889 ha mantenido la inercia, ahí es donde 579 00:44:32,889 --> 00:44:35,090 el angular drag podría haber detenido la bola 580 00:44:35,090 --> 00:44:36,150 esto ahora lo vemos 581 00:44:36,150 --> 00:44:38,829 pero digamos que hay que discriminar los objetos 582 00:44:38,829 --> 00:44:40,630 que vamos a usar mediante 583 00:44:40,630 --> 00:44:42,730 lógicas de físicas 584 00:44:42,730 --> 00:44:44,849 y los que vamos a mover por lógicas 585 00:44:44,849 --> 00:44:45,789 de transform 586 00:44:45,789 --> 00:44:48,889 para que funcione lo más correctamente posible 587 00:44:48,889 --> 00:44:51,110 lo relacionado con las físicas 588 00:44:51,110 --> 00:44:52,369 como son estas colisiones 589 00:44:52,369 --> 00:44:55,010 lo suyo es usar métodos físicos 590 00:44:55,010 --> 00:44:57,010 también para aplicar fuerzas al rigid body 591 00:44:57,010 --> 00:44:58,030 que se muevan los objetos 592 00:44:58,030 --> 00:44:59,150 ¿vale? 593 00:44:59,889 --> 00:45:04,630 como va a ser un poco 594 00:45:04,630 --> 00:45:06,449 largo que escriba todo el código 595 00:45:06,449 --> 00:45:08,389 os voy a enseñar, aquí tenía la otra esfera 596 00:45:08,389 --> 00:45:29,409 preparada y la activo y ahí está, es muy parecida a la que teníamos y lo único, le he subido un poco la masa, no es un trigger porque no queremos que se comporte de manera física, es decir, que choque y he añadido un script que se llama PlayerManager, que os voy a enseñar ahora mismo. 597 00:45:29,409 --> 00:45:51,630 Este PlayerManager, y vais a ver que la lógica es muy parecida a lo que ya hemos visto en la tarea 2 y a lo que hablamos en la última tarea, que es esto del GetComponent, esencial ahora mismo para poder afectar a este componente de RigidBody, porque recordad que menos el transform a todos los componentes que queramos acceder tendremos que llegar de alguna forma. 598 00:45:51,630 --> 00:45:55,710 recordad que esto lo vimos el otro día 599 00:45:55,710 --> 00:45:56,909 pero nada, este es el código 600 00:45:56,909 --> 00:46:01,050 habrá que hacer este GetComponent del RigidBody del objeto 601 00:46:01,050 --> 00:46:02,650 que tiene este script 602 00:46:02,650 --> 00:46:06,250 fijaos, aquí están creados 603 00:46:06,250 --> 00:46:10,369 dos Floats que básicamente lo que hace es capturar 604 00:46:10,369 --> 00:46:13,250 dos Axis que se llaman 605 00:46:13,250 --> 00:46:14,750 VerticalBola y HorizontalBola 606 00:46:14,750 --> 00:46:17,650 estos Axis los he creado yo 607 00:46:17,650 --> 00:46:20,110 como ya hemos visto en la anterior tarea 608 00:46:20,110 --> 00:46:22,369 los project settings 609 00:46:22,369 --> 00:46:24,289 input manager y ahí horizontal 610 00:46:24,289 --> 00:46:26,250 bola, horizontal terreno, vertical bola 611 00:46:26,250 --> 00:46:28,110 y vertical terreno, porque 612 00:46:28,110 --> 00:46:29,750 lo pone en el enunciado, voy a hacer 613 00:46:29,750 --> 00:46:32,570 con el WASD y con la cruceta del teclado 614 00:46:32,570 --> 00:46:34,590 que en unos niveles el WASD 615 00:46:34,590 --> 00:46:36,690 sea el que mueva la bola y en otros niveles 616 00:46:36,690 --> 00:46:38,710 sea la cruceta la que mueva el terreno 617 00:46:38,710 --> 00:46:40,550 en el primero el terreno está fijo 618 00:46:40,550 --> 00:46:42,190 no se mueve, no va a tener fuerza 619 00:46:42,190 --> 00:46:44,010 pero en los otros dos, si miráis 620 00:46:44,010 --> 00:46:45,909 como en lo que se pide 621 00:46:45,909 --> 00:46:47,389 pues si va a hacer que se incline 622 00:46:47,389 --> 00:46:49,889 la modo de balanza 623 00:46:49,889 --> 00:46:52,329 que se incluye la propia 624 00:46:52,329 --> 00:46:53,309 tabla 625 00:46:53,309 --> 00:46:54,250 entonces 626 00:46:54,250 --> 00:46:58,210 lo primero es que para a la bola 627 00:46:58,210 --> 00:47:00,269 en este caso, que es la que tiene este script 628 00:47:00,269 --> 00:47:02,230 lo que queremos es 629 00:47:02,230 --> 00:47:03,969 que mueva el RigidBody, importante 630 00:47:03,969 --> 00:47:06,349 porque de primera no es lo más 631 00:47:06,349 --> 00:47:08,050 intuitivo y de hecho lo han hecho 632 00:47:08,050 --> 00:47:10,150 menos intuitivo en esta versión 633 00:47:10,150 --> 00:47:11,630 2022 con respecto a anteriores 634 00:47:11,630 --> 00:47:13,949 porque en anteriores, si usáis por ejemplo Unity 635 00:47:13,949 --> 00:47:16,010 2020, que por cierto en el tema 636 00:47:16,010 --> 00:47:17,929 6 probablemente demos 637 00:47:17,929 --> 00:47:20,110 un pasito atrás en el software para simplificar 638 00:47:20,110 --> 00:47:22,130 explicaciones, pero bueno, veréis 639 00:47:22,130 --> 00:47:23,929 que los RigidBodies tienen un apartado abajo 640 00:47:23,929 --> 00:47:26,010 de info que te muestran 641 00:47:26,010 --> 00:47:27,849 como las inercias 642 00:47:27,849 --> 00:47:29,530 y las fuerzas de velocidad que tienen 643 00:47:29,530 --> 00:47:32,269 los elementos, las fuerzas 644 00:47:32,269 --> 00:47:34,010 que se le aplican al RigidBody. Pero 645 00:47:34,010 --> 00:47:36,250 si hay un elemento, si hay un componente 646 00:47:36,250 --> 00:47:38,429 perdonad, que gestiona las fuerzas 647 00:47:38,429 --> 00:47:40,030 y por eso hay que asociarlo a ello, es 648 00:47:40,030 --> 00:47:42,250 el RigidBody. Por eso 649 00:47:42,250 --> 00:47:43,809 lo que vamos a hacer es 650 00:47:43,809 --> 00:47:45,869 acceder mediante este 651 00:47:45,869 --> 00:47:49,670 tipo de variable, recordad que aquí poníamos el tipo de 652 00:47:49,670 --> 00:47:54,030 el nombre del componente que tuviera para guardarlo como variable 653 00:47:54,030 --> 00:47:58,170 y luego ya lo capturábamos para su uso, aquí lo vamos a capturar con RB 654 00:47:58,170 --> 00:48:02,150 por ejemplo, luego podremos acceder a 655 00:48:02,150 --> 00:48:06,010 propiedades de este componente RigidBody que no están directamente aquí 656 00:48:06,010 --> 00:48:10,130 recogidas, pero sí pertenecen a lo que está programado dentro de este componente 657 00:48:10,130 --> 00:48:13,949 que entre ellas son, está en el tema, el AddForce 658 00:48:13,949 --> 00:48:15,789 y el acto orque. Bueno, aquí he usado 659 00:48:15,789 --> 00:48:17,809 una de cada para que esté el variado 660 00:48:17,809 --> 00:48:19,630 de cómo se usa, pero al ser una bola 661 00:48:19,630 --> 00:48:21,889 la fuerza sirve para 662 00:48:21,889 --> 00:48:23,809 lo mismo que la rotación, porque al final el rotar 663 00:48:23,809 --> 00:48:25,849 también al final se mueve. Si fuera un 664 00:48:25,849 --> 00:48:27,869 cubo, la fuerza así desplazaría el cubo 665 00:48:27,869 --> 00:48:29,590 y la rotación, a menos que le demos mucha 666 00:48:29,590 --> 00:48:31,889 por las esquinas que tiene en los cantos 667 00:48:31,889 --> 00:48:33,550 pues no giraría, ¿vale? Pero 668 00:48:33,550 --> 00:48:35,730 mirad que en esencia es lo mismo que hacía 669 00:48:35,730 --> 00:48:37,889 un jolanave para moverlo, solo que estamos 670 00:48:37,889 --> 00:48:38,929 usando otros métodos. 671 00:48:40,250 --> 00:48:41,949 Y vamos a analizar esto un poquito 672 00:48:41,949 --> 00:48:43,869 más en detalle, ¿vale? Lo primero 673 00:48:43,869 --> 00:48:45,969 es, igual que el otro 674 00:48:45,969 --> 00:48:47,869 día en uno de los 675 00:48:47,869 --> 00:48:49,730 movimientos el axi lo guardamos en una variable 676 00:48:49,730 --> 00:48:51,869 eso es lo mismo, lo hacemos en el update 677 00:48:51,869 --> 00:48:54,070 ¿y por qué en el update? 678 00:48:54,929 --> 00:48:55,789 porque vais a ver 679 00:48:55,789 --> 00:48:57,489 que ahora se está digregando en el update 680 00:48:57,489 --> 00:48:58,630 y el fix update 681 00:48:58,630 --> 00:49:01,369 así dicho rápido 682 00:49:01,369 --> 00:49:03,869 el tiempo de ejecución que habría que usar 683 00:49:03,869 --> 00:49:05,829 para métodos que emplean físicas 684 00:49:05,829 --> 00:49:08,110 ¿vale? a diferencia del update 685 00:49:08,110 --> 00:49:09,889 que en cuanto puede 686 00:49:09,889 --> 00:49:12,070 va refrescando y generando más fotogramas 687 00:49:12,070 --> 00:49:13,929 para que sea lo más fluido el juego posible. 688 00:49:14,409 --> 00:49:17,449 El Fixed Update tiene un tiempo predeterminado. 689 00:49:17,590 --> 00:49:20,590 Recordad que esto estaba en Edit, Project Settings, 690 00:49:20,590 --> 00:49:25,409 y en el apartado de Time, que es este que está aquí, 691 00:49:26,489 --> 00:49:27,010 ¿qué va a decir? 692 00:49:27,429 --> 00:49:30,070 Cada 0,02 segundos, en este caso, 693 00:49:30,969 --> 00:49:34,010 va a ejecutar lo que haya dentro del Fixed Update, 694 00:49:34,329 --> 00:49:35,110 impepinablemente. 695 00:49:35,789 --> 00:49:37,929 Si el ordenador no pudiera, 696 00:49:38,650 --> 00:49:40,650 porque, bueno, si lo ponemos muy bajito, 697 00:49:40,650 --> 00:50:04,269 Por mucho que nos empeñemos, el ordenador igual no tiene la capacidad. Hay un máximo que podemos marcar antes de que de error o deje de ejecutarse o surjan conflictos. Por cierto, algunos ya habéis tocado el time.timescale y básicamente lo que estaréis cambiando en ese caso es esto. También podéis decir que todo el juego vaya al doble de velocidad o se detenga. Esto se hablaba en el tema anterior. 698 00:50:05,269 --> 00:50:25,530 Lo dicho, tiene un tiempo de ejecución fijo, ¿vale? Para que la física, los cálculos físicos que tienen sean estables, ¿vale? Ahí no es tanto que en cada fotograma vaya cambiando el valor de posición X, tal, tal, en cuanto pueda, sino que aquí tiene que haber cierta coherencia también para que sea estable con este tiempo, ¿no? 699 00:50:25,530 --> 00:50:44,710 Entonces, si os fijáis aquí, y esta lógica es la que también tenéis que ir integrando, es que en el update normalmente lo que vamos a querer es captar las interacciones, porque en cuanto pulsemos una tecla queremos que el sistema ya lo guarde en esa variable, y ya está guardado. 700 00:50:44,710 --> 00:50:50,630 en cuanto toquemos una tecla lo más rápido posible que pueda el ordenador, va a guardar en esta variable las variaciones de input que hagamos. 701 00:50:51,789 --> 00:51:01,110 Y aquí está, guardado como variable global. Y está aquí hasta que se lo pida en la próxima antelación física que haya este FixUpdate. 702 00:51:02,230 --> 00:51:10,710 Por un lado tenemos la captura, lo que nos interesa que sea lo más rápido, y luego los comportamientos de RigidBody, de física, lo ponemos dentro del FixUpdate. 703 00:51:10,710 --> 00:51:26,489 Este ejemplo simple es lo que se espera. Todo luego se puede buscar que sea de otra forma, pero el comportamiento esperable o deseable para hacer inputs que muevan objetos con fuerzas físicas sería así. 704 00:51:26,489 --> 00:51:34,289 capturar el input en el update y luego ejecutarlo en el fix update. Recordad, este addForce sale 705 00:51:34,289 --> 00:51:41,090 porque estamos entrando dentro de las propiedades, en este caso de los métodos, que tiene el RigidBody 706 00:51:41,090 --> 00:51:47,929 ya programado. Entonces cuando ponemos este rb.addForce, como tantas otras ocasiones, 707 00:51:47,929 --> 00:52:06,150 Al empezar a escribir nos ponemos y nos dice qué argumentos espera dentro de estos paréntesis y cuando abrimos el paréntesis puede tener distintos, cuatro sobrecargas y aquí hay distintas formas de aplicar fuerza. 708 00:52:06,849 --> 00:52:10,250 Lo importante normalmente, y en este, aunque hay cuatro, en realidad son lo mismo, 709 00:52:10,670 --> 00:52:14,710 podemos pasarle un vector 3, igual que hacíamos en el Translate, por ejemplo. 710 00:52:15,650 --> 00:52:19,590 Luego, opcionalmente, es otra sobrecarga, podemos decirlo, el modo de fuerza, 711 00:52:19,769 --> 00:52:21,989 porque se puede añadir que las fuerzas sean más explosivas, 712 00:52:22,489 --> 00:52:26,530 que una sea como que coja, que lo sea con respecto a la masa, 713 00:52:27,030 --> 00:52:31,050 que ya tenga ahí, por ejemplo, al dar un salto, pues no sea una aceleración continua, 714 00:52:31,050 --> 00:52:35,150 sino que respete el peso que tiene ya el objeto, y por eso un salto, un impulso, 715 00:52:35,150 --> 00:52:37,369 sería un impulso como tal 716 00:52:37,369 --> 00:52:39,949 hay distintos, separado de comas 717 00:52:39,949 --> 00:52:40,769 force modes 718 00:52:40,769 --> 00:52:43,630 y en vez de un vector 3, si queremos pasar 719 00:52:43,630 --> 00:52:45,469 también los distintos 720 00:52:45,469 --> 00:52:47,550 dimensiones de un vector 3 721 00:52:47,550 --> 00:52:48,769 en realidad, pues también se puede 722 00:52:48,769 --> 00:52:51,250 disgregando cada uno, un poco como 723 00:52:51,250 --> 00:52:53,710 hacíamos con el 724 00:52:53,710 --> 00:52:54,070 translate 725 00:52:54,070 --> 00:52:57,449 y al añadir 726 00:52:57,449 --> 00:52:59,590 fuerza, que es lo que vamos a hacer 727 00:52:59,590 --> 00:53:01,289 pues poner 728 00:53:01,289 --> 00:53:03,670 ese vector que marca la dirección 729 00:53:03,670 --> 00:53:04,929 que normalmente 730 00:53:04,929 --> 00:53:21,510 Para tener direcciones ya normalizadas, recordad que está este forward, este up, este backwards, este right, left, etc., que es este 0, 0, 1. Mirad la descripción, atajo, para escribir vector 3, 0, 0, 1. 731 00:53:21,510 --> 00:53:30,889 Yo aquí podría decir, en vez de esto, esto ya lo hemos visto unas veces, pero está bien siempre recordarlo, que ese vector forward sería lo mismo que hacer esto. 732 00:53:32,489 --> 00:53:41,070 Estábamos diciendo que la fuerza se añada en profundidad, es decir, 0 y 0 no se añade ninguna fuerza, pero en Z se añade 1, es decir, hacia el fondo. 733 00:53:41,690 --> 00:53:48,869 Y luego, aparte, este 1, esta fuerza que se está dando, será más o menos intensa dependiendo del axis. 734 00:53:48,869 --> 00:54:00,010 Si tenemos un teclado será muy intensa porque es pulsar una tecla y pasa de 0 a 1 directamente, a no ser que cambiemos, si recordáis en el Input Manager, la gravedad, la sensibilidad, etc. 735 00:54:00,510 --> 00:54:09,590 ¿Os acordáis? Y aparte, con fuerza, que es otro parámetro que podemos nosotros ir ajustando, lo multiplicamos para ajustarlo por la fuerza que nos interese. 736 00:54:10,210 --> 00:54:16,269 Digamos que esto es lo que marca la dirección, esto es lo que marca la influencia del input, 737 00:54:16,610 --> 00:54:23,889 y luego hay un multiplicador siempre que hacemos para, oye, esta fuerza es baja, pues vamos a multiplicarla por más. 738 00:54:24,409 --> 00:54:27,230 En vez de poner aquí la fuerza se podría decir, vale, pues que esto sea 60. 739 00:54:28,110 --> 00:54:33,590 Pero bueno, es más fácil tener un valor independiente que además se puede usar a lo mejor en más elementos 740 00:54:33,590 --> 00:54:40,750 que también tengan necesidad de establecer una fuerza, y se pone así y ya multiplica este vector normalizado, ¿vale? 741 00:54:41,690 --> 00:54:49,670 Y el actor es un poco lo mismo, es con respecto a ese eje y pone forward, ¿vale? Porque lo hace con respecto al eje. 742 00:54:50,210 --> 00:54:58,590 Por tanto, si yo, fijaos en el guismo general del mundo, si yo lo que quiero es que la bola rote a izquierda o a derecha, ¿vale? 743 00:54:58,590 --> 00:55:27,510 Lo que quiero es que rote con respecto al forward, ¿no? Que es la profundidad. Si rota en base a ese z, irá izquierda o derecha. Por eso, paradójicamente, este vector no es lo mismo en el add force que en el add torque. De hecho, están invertidos realmente. ¿Vale? Y luego, bueno, este menos sirve para si la dirección del giro no va en la dirección que queremos, siempre lo podemos invertir, porque esto al final lo que hará es que ese 1 sea un menos 1 en el vector. ¿Sí? 744 00:55:28,590 --> 00:55:42,989 Básicamente ahora si yo guardo este código que lo tiene aplicada la esfera y voy al juego y voy aquí y clico en Game y doy adelante y atrás, 745 00:55:43,730 --> 00:55:48,630 fijaos que la bola ya empieza a tener ciertas inercias. Se mueve de izquierda a derecha. 746 00:55:50,730 --> 00:55:58,130 Importante, esto no sé si lo habréis notado ya, pero para que la interacción las capte tenéis que clicar en Game 747 00:55:58,130 --> 00:56:00,289 ¿vale? aunque luego 748 00:56:00,289 --> 00:56:02,429 y estar en game y dais a las interacciones 749 00:56:02,429 --> 00:56:04,570 yo al WASP ahora mismo que es como está configurado 750 00:56:04,570 --> 00:56:06,550 ¿vale? pero eso no quita que luego 751 00:56:06,550 --> 00:56:07,590 podáis seleccionar 752 00:56:07,590 --> 00:56:10,369 en el escen y arrastrarlo 753 00:56:10,369 --> 00:56:12,469 ponerlo en otro sitio y clicar otra vez 754 00:56:12,469 --> 00:56:14,510 al game y que vuelva a capturar 755 00:56:14,510 --> 00:56:16,090 las interacciones ¿vale? 756 00:56:16,409 --> 00:56:18,369 si os fijáis, los he puesto públicos 757 00:56:18,369 --> 00:56:20,409 o serializados, no lo sé, para que se vea 758 00:56:20,409 --> 00:56:22,170 la interacción, el axis como 759 00:56:22,170 --> 00:56:23,889 estoy dando a las teclas, de 0 a 1 760 00:56:23,889 --> 00:56:26,210 o de 0 a menos 1, esos valores 761 00:56:26,210 --> 00:56:28,170 intermedios son la gravedad y la sensibilidad 762 00:56:28,170 --> 00:56:29,349 que hablamos el otro día 763 00:56:29,349 --> 00:56:32,110 ¿vale? y eso ya tiene influencia 764 00:56:32,110 --> 00:56:33,590 en cómo aplica fuerzas 765 00:56:33,590 --> 00:56:34,650 ¿vale? 766 00:56:35,909 --> 00:56:37,130 entonces, bueno, pues 767 00:56:37,130 --> 00:56:39,590 este es el comportamiento para mover la bola 768 00:56:39,590 --> 00:56:42,090 y en los siguientes niveles 769 00:56:42,090 --> 00:56:44,469 voy a los siguientes niveles 770 00:56:44,469 --> 00:56:45,769 para 771 00:56:45,769 --> 00:56:48,289 voy a una de las escenas que ya tengo 772 00:56:48,289 --> 00:56:49,329 guardo, ¿vale? 773 00:56:49,849 --> 00:56:51,429 en este lo que voy a hacer es 774 00:56:51,429 --> 00:56:54,070 con la otra cruceta, porque lo he configurado 775 00:56:54,070 --> 00:56:56,090 así en el input manager 776 00:56:56,090 --> 00:57:17,530 se va a ir moviendo, no la bola, sino la plataforma, es decir, ahora mismo la plataforma, la tengo aquí, es el que tiene este terreno move, el que mueve el terreno, entonces si me meto en ese objeto, en ese código, vais a ver que al final es un poco lo mismo, 777 00:57:17,530 --> 00:57:33,090 Tengo el MoveH, el MoveR, me meto en el... Bueno, recordad el otro día que podía hacer esto de GetComponent o arrastrar, si es serializado, y vais a ver, arrastrar el objeto para que coja el RigidBody de en sí mismo, en este caso. 778 00:57:33,090 --> 00:57:47,309 En realidad está cogiendo a sí mismo, que es la otra forma de llegar a ello. Tengo esta fuerza, en el Update cojo el axis, lo he configurado en este caso en vez de bola, se llama terreno, son otras teclas las que he indicado. 779 00:57:47,530 --> 00:57:54,469 Y añade un torque, en este caso, ¿vale? Porque no quiero que sea una fuerza de desplazamiento, sino que gire con respecto al centro de su gravedad, ¿vale? 780 00:57:54,469 --> 00:58:03,010 Que es el centro de la tabla en sí, pues hacia derecha, hacia la izquierda, multiplicándose por los valores que esté capturando y por el valor de torque que hayamos establecido. 781 00:58:03,510 --> 00:58:10,389 Torque, que es igual que speed o fuerza o lo que queramos, una convención o una variable que creamos para multiplicar por ese valor. 782 00:58:10,389 --> 00:58:18,190 que puede ser, pues si nos parece que está lento, pues subimos aquí, podemos ir y se aplicará mayor torque a esta tabla. 783 00:58:18,530 --> 00:58:30,699 Siguientes cosas. Vamos a hablar de cómo... Vale, ya tengo la bola aquí, ¿vale? Y fijaos... Bueno, la cámara, voy a ajustarla. 784 00:58:31,119 --> 00:58:37,860 Aquí habría que hacer, si nos interesa un seguimiento de cámara, igual que hicimos el otro día, con la tarea me refiero, 785 00:58:37,860 --> 00:58:50,880 y voy a hacer que aún así no se va a ir moviendo con la cámara, que eso se haría con un script que siga a la bola, por ejemplo, 786 00:58:51,019 --> 00:58:55,639 o al tablero cuando gira en los otros niveles, lo voy a dejar ahí para que se vea mejor. 787 00:58:56,539 --> 00:59:04,639 Vale, entonces muevo aquí la bola y voy al agujero y no sigue para adelante. 788 00:59:04,639 --> 00:59:25,719 ¿Por qué será? Recordáis que teníamos un cubo aquí puesto, que no es un trigger, si fuera un trigger sí lo dejaría pasar, si ponemos un non-trigger en ese código pues haría algo, ¿vale? De momento esto no lo quiero, de hecho me voy a cargar, bueno, no lo voy a cargar porque igual luego me sirve para explicar lo de la meta, pero bueno, lo desconecto el collider y ahora ya sí. 789 00:59:25,719 --> 00:59:28,699 seguimos, intento llegar al agujero 790 00:59:28,699 --> 00:59:29,699 al agujero, al agujero 791 00:59:29,699 --> 00:59:32,019 y me pongo ahí y 792 00:59:32,019 --> 00:59:33,659 anda, que no se mete 793 00:59:33,659 --> 00:59:36,420 lo que habíamos hablado, esto sucede 794 00:59:36,420 --> 00:59:38,320 porque tenemos puesto un 795 00:59:38,320 --> 00:59:40,320 boss collider que está haciendo una 796 00:59:40,320 --> 00:59:42,139 forma básica de 797 00:59:42,139 --> 00:59:44,079 collider, ¿vale? por tanto este collider 798 00:59:44,079 --> 00:59:46,119 para este caso, no sirve 799 00:59:46,119 --> 00:59:48,480 si hubiera creado esta plataforma 800 00:59:48,480 --> 00:59:50,300 por defecto 801 00:59:50,300 --> 00:59:52,059 con un cubo, no tendría ese agujero 802 00:59:52,059 --> 00:59:54,260 y tendría este boss collider, pero es que, claro, estamos buscando 803 00:59:54,260 --> 01:00:00,460 algo que es un poquito más complicado. Y el FBX que hemos metido de estos, cuando 804 01:00:00,460 --> 01:00:06,480 lo arrastramos, si clicamos, tampoco viene con este Mesh Collider. Hay que añadirlo, 805 01:00:06,539 --> 01:00:14,239 ¿vale? Importante, hay otra sección que lo pone en el enunciado sobre cuando importamos 806 01:00:14,239 --> 01:00:20,559 FBX dentro de Unity al dar al GameObject en general, ¿vale? Esto que está, si no 807 01:00:20,559 --> 01:00:27,219 y agregamos los elementos que hay dentro del fbx hay varias secciones que ya iremos viendo que 808 01:00:27,219 --> 01:00:32,340 aquí hay tela para cortar vale pero hay una que nos interesa ahora mismo y está también hecho a 809 01:00:32,340 --> 01:00:37,360 propósito que es el de las medidas de los objetos porque imaginaos este objeto lo hemos hecho en 810 01:00:37,360 --> 01:00:43,900 maya lo hemos hecho en blender lo hemos hecho en otro software de modelado imagino que también ya 811 01:00:43,900 --> 01:00:48,460 habréis tocado un poco de esto pero cada software luego tiene sus propias convenciones de medidas 812 01:00:49,079 --> 01:00:52,820 incluso cuáles son los ejes de dirección del guimón del mundo. 813 01:00:53,400 --> 01:00:59,360 Si habéis usado Blender, el X, Z e Y no están en las mismas direcciones que, por ejemplo, en Maya, ¿vale? 814 01:00:59,360 --> 01:01:05,199 Y la Z en Blender es, si no me equivoco, la vertical y Y es la horizontal. 815 01:01:05,639 --> 01:01:09,000 Entonces eso, según el software, puede generar bastantes conflictos. 816 01:01:09,599 --> 01:01:11,019 Igual pasa con las medidas. 817 01:01:11,739 --> 01:01:17,639 Si trabajáis en Maya, y para eso está este parámetro de aquí, esta casilla, 818 01:01:17,639 --> 01:01:19,239 solo vamos a tocar 819 01:01:19,239 --> 01:01:22,340 el inspector de los modelos FBX 820 01:01:22,340 --> 01:01:24,440 ahora mismo solo vamos a tocar lo relacionado con el modelo 821 01:01:24,440 --> 01:01:26,219 porque ni estamos rigando, ni animando 822 01:01:26,219 --> 01:01:28,199 ni ahora mismo 823 01:01:28,199 --> 01:01:29,940 usando materiales, ¿vale? 824 01:01:30,159 --> 01:01:31,119 ya os digo, ya lo veremos 825 01:01:31,119 --> 01:01:34,579 si nos metemos en el modelo, lo primero que salen 826 01:01:34,579 --> 01:01:36,320 son dos parámetros 827 01:01:36,320 --> 01:01:37,340 muy interesantes 828 01:01:37,340 --> 01:01:40,360 el primero, ya lo he cambiado, cuando lo metáis 829 01:01:40,360 --> 01:01:41,960 por defecto va a estar con el 1 830 01:01:41,960 --> 01:01:44,539 de hecho, mirad, lo voy a meter igual que estaba 831 01:01:44,539 --> 01:01:45,420 y 832 01:01:45,420 --> 01:01:48,059 dame un segundillo que lo tengo por aquí 833 01:01:48,059 --> 01:01:48,920 vale 834 01:01:48,920 --> 01:01:51,699 vale 835 01:01:51,699 --> 01:01:54,260 aquí, estos son los tres elementos 836 01:01:54,260 --> 01:01:56,239 los voy a arrastrar a ver si me lo admite 837 01:01:56,239 --> 01:01:57,480 otra vez, duplicados 838 01:01:57,480 --> 01:01:59,519 los he duplicado, luego los voy a borrar 839 01:01:59,519 --> 01:02:01,940 pero según meto 840 01:02:01,940 --> 01:02:03,780 una nueva 841 01:02:03,780 --> 01:02:05,880 un nuevo FBX 842 01:02:05,880 --> 01:02:07,579 va a venir con su escala de factor 1 843 01:02:07,579 --> 01:02:09,519 es decir, el valor por defecto que tenga 844 01:02:09,519 --> 01:02:11,619 de ese modelo 845 01:02:11,619 --> 01:02:13,820 de ese software, vale, y luego está el de 846 01:02:13,820 --> 01:02:15,099 conversión de unidades, si dice 847 01:02:15,099 --> 01:02:32,159 Que un centímetro del archivo valga 0,01 metros de Unity, ¿vale? Porque no es lo mismo un software que dice que la unidad es un centímetro que Unity, si recordáis, que el 1 en la escala, en Transform, cuando cambiamos, 1 significa un metro, ¿vale? 848 01:02:32,159 --> 01:02:34,519 Entonces, digamos que hay una variación de 100. 849 01:02:35,500 --> 01:02:42,380 Si meto aquí, por ejemplo, este collider, la geometría sin haberla adaptado, 850 01:02:42,460 --> 01:02:45,800 que es lo que he hecho yo para que mida lo mismo, vais a ver que es enana. 851 01:02:46,519 --> 01:02:48,860 Ahora mismo solo mide un metro. 852 01:02:49,260 --> 01:02:52,559 Recordad que esta cuadrícula es solo un metro y es esto lo que mide. 853 01:02:52,780 --> 01:02:56,159 Podríamos nosotros hacer la bola aún más pequeña y meterla ahí, etc. 854 01:02:56,500 --> 01:02:59,420 Pero hay algo importante y por lo que cuando modeléis, 855 01:02:59,420 --> 01:03:14,920 Si hacéis objetos para un videojuego, modeléis teniendo en cuenta las unidades reales de los objetos, que es que ahora estamos en el mundo de las físicas, y en las físicas influye el tamaño de los objetos. Igual que influye también la iluminación, influye las partículas. 856 01:03:14,920 --> 01:03:38,539 ¿Vale? Entonces, aunque aquí ahora intentemos hacer todo a medida, si esto mide solo un metro, esta tabla de madera sería el juego para un roedor, porque sería muy pequeña. ¿Vale? Entonces, ¿qué es lo que habría que hacer? Hombre, podríamos hacer que la escala aumente y lo aumentamos y lo damos por 10, que es precisamente, creo, la conversión que he hecho, etc. ¿Vale? 857 01:03:38,539 --> 01:04:08,519 El problema de tocar las escalas, aparte de que ya deja de estar normalizado en uno y estáis usando otros valores, que a veces ya es un fastidio, es que en ciertos momentos, cuando uséis animaciones basadas en rigs, con esqueletos, etc., tocar mucho lo que son las escalas, la escala en sí no suele tener problema, pero factores como la escala o las conversiones de unidades pueden traer conflictos de que se deformen esos rigs o nuevamente la influencia de la escala. 858 01:04:08,539 --> 01:04:10,760 de los tamaños, alteren lo esperable 859 01:04:10,760 --> 01:04:11,980 en esos RIGs, ¿vale? 860 01:04:12,139 --> 01:04:14,599 Pero si, por ejemplo, venimos de un software que sabemos 861 01:04:14,599 --> 01:04:16,639 que tiene como unidad 862 01:04:16,639 --> 01:04:18,820 convencional el 1 basado en centímetros 863 01:04:18,820 --> 01:04:20,739 como magnitud, en vez de el 1 864 01:04:20,739 --> 01:04:21,980 basado en metros como es Unity, 865 01:04:22,500 --> 01:04:24,059 solo al desmarcarse esta casilla, 866 01:04:24,639 --> 01:04:26,360 ¿vale? Lo que va a hacer es que va a haber 867 01:04:26,360 --> 01:04:27,960 una diferencia de 100 del tamaño. 868 01:04:29,119 --> 01:04:30,539 Esto significa que yo... 869 01:04:31,280 --> 01:04:32,420 Ah, perdón. Cuando hagáis 870 01:04:32,420 --> 01:04:34,460 cualquier cambio en una de estas pestañas, 871 01:04:34,579 --> 01:04:36,619 ¿vale? Tenéis que bajar y darle a aplicar. 872 01:04:36,619 --> 01:04:55,820 Importante. Y veis que ahora de pronto ese elemento se ha hecho mucho más grande. ¿Por qué? Porque ha aumentado de tamaño. Ahora mide, si nos acercamos, vemos que cada cuadrícula, cada cuadradito de estos pequeños es un metro, ahora medirá del orden de 100 metros, lo cual probablemente también sea muy grande. 873 01:04:56,619 --> 01:05:01,300 Esto es un poco, cuando me entreguéis la tarea, bueno, yo voy a querer que funcione bien. 874 01:05:01,480 --> 01:05:06,420 Que lo pongáis de 100 metros o de 1, bueno, va a influiros en los valores que vais a tener que dar, 875 01:05:06,440 --> 01:05:07,840 en la masa, en las fuerzas, etcétera. 876 01:05:08,320 --> 01:05:10,860 Pero podéis resolverla con distintos tamaños. 877 01:05:10,860 --> 01:05:18,719 Pero me interesa esto para que conozcáis que las medidas influyen en el resultado. 878 01:05:19,239 --> 01:05:24,079 Y luego, esto lo he hecho aquí ya, digamos, que 100 me parecía mucho. 879 01:05:24,079 --> 01:05:33,380 puedo hacer este factor de escala y cuando digo, este que estoy arrastrando aquí, a ver, este que tengo aquí, digo, se ha pasado mucho, 880 01:05:33,579 --> 01:05:43,039 digo, quiero que lo corrija por 0,1. Le doy a aplicar y lo hace del tamaño que era. Es decir, según he dado a la casilla y desmarcado, 881 01:05:43,260 --> 01:05:51,659 era 100 veces más grande de lo que venía por defecto cuando lo hemos visto que era como una tabla de roedor, cuando he dicho eso, ¿vale? 882 01:05:51,659 --> 01:06:09,500 Pues podemos reajustar con ese factor de escala esta conversión. Fijaos que la variación entre dar a esta casilla y desmarcarla es que pasa de un centímetro a 0,01 metros, es decir, hay 100 unidades de diferencia. Por eso pasa de 1 a 100 y con esto pasaría a 10. 883 01:06:09,500 --> 01:06:20,860 Vale, lo dicho, esto del Scale Factor solo lo usaría en caso de que no sea un elemento con armadura o que tenga animaciones en sí. 884 01:06:21,000 --> 01:06:28,380 En este caso, como todas las animaciones que vamos a hacer es porque estamos influyendo nosotros en la malla por fuerzas, etc., nos da un poco igual. 885 01:06:28,380 --> 01:06:41,820 Pero en caso de que haya un esqueleto, como veremos, es mejor tocar la escala o lo preferible desde luego es tenerlo ya en las medidas que nos interesen desde el modelo 3D. 886 01:06:43,039 --> 01:06:48,940 Aunque imaginaos que jugáis al Super Mario y tenéis el modelo a una medida y de pronto queréis con ese esqueleto que sea más grande. 887 01:06:48,940 --> 01:07:00,400 Pues lo que haríamos es aumentar la escala, ¿vale? Pero, bueno, son situaciones diferentes y es sobre todo por evitar conflictos. Por poder se puede hacer todo, pero por evitar problemas que puedan surgir, ¿vale? 888 01:07:00,400 --> 01:07:28,800 Y bueno, me cargo esta plataforma y voy a ir para atrás para cargarme todas las que incluí, que no quiero tener aquí cosas duplicadas, a ver, bueno, a ver si quiere, como he explicado tantas, a ver, fbx, nada, bueno, voy a ir al final porque al final estoy dando a control z y control y, ¿vale? Para deshacer. 889 01:07:28,800 --> 01:07:45,000 Vale, me voy a cargar estos que ha caído después, lo borro y me quedo con los que había importado, ¿vale? Que están ajustados. Para que veáis, en todos quité esto de convertir unidades y en este quería que la tabla del nivel 2 fuera un poco más grande, pues le di un poquito más de Scale Factor. 890 01:07:45,000 --> 01:07:47,480 vale, bueno y este me lo he cargado 891 01:07:47,480 --> 01:07:48,940 vale, que 892 01:07:48,940 --> 01:07:51,079 tenemos que conseguir con 893 01:07:51,079 --> 01:07:53,260 y porque, además en el terreno 1, en el 2 894 01:07:53,260 --> 01:07:55,179 vais a ver que esto no sucede, lo que os había 895 01:07:55,179 --> 01:07:57,219 dicho de que tenemos por un lado el terreno 896 01:07:57,219 --> 01:07:59,179 1 con la malla suavizada para 897 01:07:59,179 --> 01:08:00,239 que se vean los bordes 898 01:08:00,239 --> 01:08:02,699 definidos, básicamente 899 01:08:02,699 --> 01:08:04,719 la que queremos usar a nivel visual 900 01:08:04,719 --> 01:08:07,179 y luego tenemos la que tiene el collider 901 01:08:07,179 --> 01:08:09,340 versión resumida, es decir 902 01:08:09,340 --> 01:08:11,079 con pocos vértices para que no 903 01:08:11,079 --> 01:08:13,179 sobrecargue el ordenador o directamente el collider 904 01:08:13,179 --> 01:08:25,020 no funcione por esta sobrecarga, o haga una reducción que considere, y por tanto nos cargamos un poco el objetivo de intentar tener este agujero ahí accesible, ¿vale? 905 01:08:27,199 --> 01:08:37,020 Vale, pues voy a borrar esta, ¿vale? Y empezamos. Digo, yo quiero que la malla, el GameObject de la malla, sea este que tengo aquí, y lo incluyo. 906 01:08:37,020 --> 01:08:56,840 Yo tengo aquí la malla, que ojo yo, además, como quiero que la profundidad en Z sea hacia donde va la bola, pues voy a coger y le voy a dar una rotación de 180, ¿vale? Para que esté en el horizonte el agujero y no aquí. Simplemente por tener en cuenta que el horizonte, por convención, pues es hacia donde mira este Z, ¿no? 907 01:08:57,199 --> 01:09:08,180 ¿Qué sucede ahora? Si os fijáis, tenemos el GameObject, que trae el FB, que es como conjunto, y luego lo que es el hijo, que es el GameObject que tenemos aquí. 908 01:09:08,640 --> 01:09:15,079 Realmente, si os fijáis, este primero que tenemos aquí no sirve para nada, excepto para ser cápsula de lo segundo. 909 01:09:15,079 --> 01:09:25,659 Por tanto, yo podría coger, desempaquetar, me voy al padre, el prefab, desempaqueto, y digo, ala, lo saco de hijo y fuera. 910 01:09:25,659 --> 01:09:34,199 Dejo el terreno 1 que es el que hace que se visualice porque tiene el mesh renderer con la geometría y la malla de visualización, el mesh filter 911 01:09:34,199 --> 01:09:42,859 Pero a esto le falta otra cosa, le falta, porque si ahora doy play, como no hay ningún collider, nada que detenga la bola, veis que se hunde y cae para abajo 912 01:09:42,859 --> 01:09:46,439 ¿Qué es lo que voy a añadir? Pues un collider 913 01:09:46,439 --> 01:09:56,380 Como hemos dicho, un Bosch Collider sería lo más eficiente a nivel de cálculo, pero no nos va a permitir meter ese agujero o lo que sea la forma que tenga una malla. 914 01:09:56,880 --> 01:10:05,000 Si voy a... No, Collider no. Ese es para ruedas. Ese es aún más avanzado. Sería el mes de malla, mes Collider. Ahí está. 915 01:10:05,640 --> 01:10:11,239 Cuando son Collider los iconitos vais a ver que son verdes. ¿Y qué puedo hacer con eso? 916 01:10:11,239 --> 01:10:20,739 Tiene un apartadito aquí de la malla que va a usar para ser ese mes, que es en la que podemos arrastrar esta que tenemos aquí reducida. 917 01:10:20,939 --> 01:10:27,479 Entonces yo puedo decir que este es el terreno y aquí cojo la malla, ¿vale? No el GameObject en sí, sino la malla. 918 01:10:28,500 --> 01:10:36,060 Y además, fijaos, como siempre sucede, que aquí está pidiendo un iconito que se corresponde luego con los iconitos de lo que es compatible y lo que no. 919 01:10:36,060 --> 01:10:43,579 Si yo arrastro esta malla, vais a ver que ahora tengo en un mismo objeto lo visual y el collider. 920 01:10:43,819 --> 01:10:45,920 Y el collider es la versión simplificada que vimos. 921 01:10:46,079 --> 01:10:53,619 Veis que tiene este agujero, pero no es el que tiene tanta geometría como este que teníamos aquí. 922 01:10:54,640 --> 01:10:55,439 Es este. 923 01:10:55,439 --> 01:11:13,180 Con esto ya hemos conseguido que la bola, este objetivo que teníamos de que cuando la bola llega al agujero, voy a coger el terreno para que veáis, sí que se va a meter porque cabe en el agujero y lo está respetando. 924 01:11:13,180 --> 01:11:32,520 Y ahí se ha quedado, ¿eh? Ahí está la bola, ahí se ha quedado. Ya podéis hacer un juego de golf, ¿vale? ¿Por qué no pasa más? Pues porque nuevamente ahí hay un límite de esta malla. Y ojo, esto nuevamente en el MES Collider puede venir, ahora vemos algo más, la opción de que permita ser trigger o no. 925 01:11:32,520 --> 01:11:55,460 Como no queremos que atraviese ningún caso, esto nunca va a ser trigger, ¿vale? No lo marcamos. Pero ojo, el otro objetivo es lo que habíamos dicho, queremos que haya un detector aquí de que, ¿vale? Y veis que ya tengo aquí preparadito este cubo, que ahora mismo es muy grande, 0,1, 0,1, y voy a hacerlo pequeño, 0,1, 0,1, ¿vale? 926 01:11:55,460 --> 01:12:12,319 Lo estoy haciendo con el propio Box Collider, los tamaños, etc. También, les hago un segundo, se puede hacer con la escala, ¿vale? Nuevamente, si se puede hacer algo con el propio componente, lo haría antes que con la escala, ¿vale? Y también se queda con ese tamaño. 927 01:12:12,319 --> 01:12:13,939 Voy a activarlo para que esté 928 01:12:13,939 --> 01:12:16,819 ¿Vale? Y entonces, bueno, voy a ponerlo 929 01:12:16,819 --> 01:12:18,079 Como a mí me gusta, que es 930 01:12:18,079 --> 01:12:20,560 Oye, pues si es un Boss Collider, en vez de cambiar 931 01:12:20,560 --> 01:12:22,460 Toda la proporción del GameObject 932 01:12:22,460 --> 01:12:24,079 Vamos a hacerlo con 933 01:12:24,079 --> 01:12:26,880 Esta 934 01:12:26,880 --> 01:12:29,819 Con las medidas del propio 935 01:12:29,819 --> 01:12:32,420 Collider. Entonces, ojo, ahora lo que vamos a hacer 936 01:12:32,420 --> 01:12:34,260 Es poner aquí, podría ser incluso más pequeño 937 01:12:34,260 --> 01:12:36,079 Lo importante es que haya algún momento 938 01:12:36,079 --> 01:12:37,619 Que la bola lo atraviese 939 01:12:37,619 --> 01:12:40,039 Atraviese, no queremos que sea un impedimento 940 01:12:40,039 --> 01:12:41,619 Y por eso va a ser un 941 01:12:41,619 --> 01:12:43,119 Trigger, marcado ahí 942 01:12:43,119 --> 01:12:45,119 para detectar los onTriggers 943 01:12:45,119 --> 01:12:47,539 y lo dejamos ahí para que en cuanto 944 01:12:47,539 --> 01:12:49,319 la bola pase por ahí 945 01:12:49,319 --> 01:12:51,260 pues diga, eh, cambia de nivel o eh 946 01:12:51,260 --> 01:12:52,939 lanza el mensaje o eh, lo que sea 947 01:12:52,939 --> 01:12:56,760 importante 948 01:12:56,760 --> 01:12:58,920 y lo he dejado caer antes 949 01:12:58,920 --> 01:13:01,579 si esto lo hiciéramos más grande 950 01:13:01,579 --> 01:13:03,600 en plan, decimos, bueno, el cubo lo meto ahí 951 01:13:03,600 --> 01:13:05,079 y que sea así de grande 952 01:13:05,079 --> 01:13:07,180 ten en cuenta que esto estaría en todo momento 953 01:13:07,180 --> 01:13:09,520 tocando la malla del padre 954 01:13:09,520 --> 01:13:10,939 ¿vale? entonces hay que 955 01:13:10,939 --> 01:13:13,020 ajustarlo bien de tamaño 956 01:13:13,020 --> 01:13:42,159 A menos del momento que no estamos haciendo nada para discriminar, ¿vale? Entonces, si no me equivoco y si no lo vuelvo a recrear, este trigger que tenemos aquí preparado, cuando, vuelvo a poner aquí el código, cuando, ahora no es un onCollision, sino que queremos usar el onTrigger, ¿vale? Y el onTrigger enter, solo una vez cuando entre, ¿vale? Cuando entre en ese cubito, se lanza impacto que es trigger activado, ¿vale? Simplemente un mensaje de control con debug log. 957 01:13:42,159 --> 01:13:45,020 ahora vamos a ver que ya con esto 958 01:13:45,020 --> 01:13:47,239 voy a jugar a la partida 959 01:13:47,239 --> 01:13:48,220 aquí 960 01:13:48,220 --> 01:13:50,720 fijaos que tengo la escena preparada para ver 961 01:13:50,720 --> 01:13:52,640 cómo se mete ahí, pongo el 962 01:13:52,640 --> 01:13:54,819 sucesos collider, voy a game 963 01:13:54,819 --> 01:13:56,359 empieza a mover la pelota 964 01:13:56,359 --> 01:13:58,779 se irá acercando por esta parte 965 01:13:58,779 --> 01:13:59,539 la vais a ver 966 01:13:59,539 --> 01:14:03,039 le estoy dando fuerza, fuerza, paro ahí 967 01:14:03,039 --> 01:14:05,140 voy a abrir la consola 968 01:14:05,140 --> 01:14:07,039 para que veáis que en cuanto toque ese 969 01:14:07,039 --> 01:14:07,899 trigger 970 01:14:07,899 --> 01:14:11,600 trigger activado 971 01:14:11,600 --> 01:14:13,899 Aquí hemos puesto trigger activado 972 01:14:13,899 --> 01:14:15,399 En este método que hemos creado de impacto 973 01:14:15,399 --> 01:14:16,840 O meta, o como lo llamemos 974 01:14:16,840 --> 01:14:18,779 Pero aquí podríamos decir 975 01:14:18,779 --> 01:14:21,699 Que explote el juego, que la tabla 976 01:14:21,699 --> 01:14:23,760 Cambie de color, que pasemos de nivel 977 01:14:23,760 --> 01:14:25,840 ¿Vale? Que es lo que nos interesa, etc 978 01:14:25,840 --> 01:14:27,640 Lo mismo sucederá 979 01:14:27,640 --> 01:14:29,659 Si creamos otro trigger 980 01:14:29,659 --> 01:14:31,800 Como este, lo hacemos muy grande 981 01:14:31,800 --> 01:14:33,020 Y lo ponemos debajo 982 01:14:33,020 --> 01:14:35,119 Que cuando la bola se caiga por un lado 983 01:14:35,119 --> 01:14:37,579 Y toque ese trigger, también podemos decir 984 01:14:37,579 --> 01:14:39,680 Reinicia el nivel, destruyete 985 01:14:39,680 --> 01:14:41,079 Haz lo que sea, ¿vale? 986 01:14:41,079 --> 01:14:51,359 Eso ya sabemos crear entis o objetos con sus colliders y que capte posiciones o colisiones de objetos que tocan con objetos. 987 01:14:51,619 --> 01:15:07,380 Voy a hablar de algo que se profundiza más en la unidad 4, pero que está esbozado aquí en el enunciado de la tarea 3, que es lo de cambiar de nivel. 988 01:15:07,380 --> 01:15:18,659 Voy a decir que ese onTrigger que ya está en el cubillo este que he puesto dentro del agujero, pues que sirva para cambiar de nivel. 989 01:15:19,220 --> 01:15:21,720 Simplemente cambia el nombre, ahora lo importante es lo que hay adentro. 990 01:15:21,800 --> 01:15:26,840 Como no va a ser un collisionEnter me lo cargo porque quiero que sea en base a onTrigger y aquí estoy haciendo esto. 991 01:15:27,420 --> 01:15:29,899 Importante, importantísimo, porque no es solo para este momento. 992 01:15:29,899 --> 01:15:58,680 Muchas veces hay operaciones, funciones, propiedades que tienen que deber de librerías o de capacidades que no hemos incluido en este script. Y esta va a ser una. Cuando hagamos gestión de escenas, es decir, para poder cambiar entre niveles, para ir navegando o activando distintos niveles o escenas, mejor dicho, yo identifico mucho escenas con niveles, pero son escenas en sí, hay que cargar otra librería, 993 01:15:58,680 --> 01:16:18,899 que es UnityEngine.SceneManagement, así se llama, hay que aprendérselo, ¿vale? Habrá otros, iremos viendo, que son importantes. Esto es esencial porque si no de pronto os ponéis a escribir, ponéis cosas que luego no existen, ¿vale? 994 01:16:18,899 --> 01:16:30,159 Me voy a abrir yo aquí mi chuletilla un segundo para ir más rápido y no tener que pensar tanto y si eso ahora lo enseño, pero prefiero explicaros primero un par de cosas, ¿vale? 995 01:16:30,479 --> 01:16:44,420 Cuando incluimos esta línea de código va a haber una clase importante que es esta que se llama Scene Manager que existe aquí para poner bastantes cosas, bastantes métodos. 996 01:16:44,420 --> 01:16:55,260 Uno de ellos es el de cargar escena, ¿vale? Y aquí vamos a poner uno. Bueno, veis que no da fallo, ¿vale? Si yo esta línea no la hubiera incorporado, da fallo, ¿vale? 997 01:16:55,279 --> 01:17:08,680 Por eso es importante esto de las librerías. Cuando vayamos a hacer algo de gestión de escenas, significa que habrá que usar, habrá que incluir en este script la librería relacionada con el Scene Management, ¿vale? 998 01:17:08,680 --> 01:17:12,520 ¿Cómo hacemos esto de la gestión de escenas? 999 01:17:12,680 --> 01:17:14,920 Hay, volveremos también en el futuro 1000 01:17:14,920 --> 01:17:17,840 Un menú esencial para cuando acabemos el juego 1001 01:17:17,840 --> 01:17:20,840 Y poder compilarlo, es decir, sacar el ejecutable del juego 1002 01:17:20,840 --> 01:17:22,319 Que es este file 1003 01:17:22,319 --> 01:17:25,340 Aquí, build settings, ¿vale? 1004 01:17:26,279 --> 01:17:28,199 Si nos metemos en esta opción 1005 01:17:28,199 --> 01:17:29,619 Nos abre otra ventanita 1006 01:17:29,619 --> 01:17:32,239 Que, ya os digo, esto es más avanzada 1007 01:17:32,239 --> 01:17:34,460 Lo veremos sobre todo en el último tema 1008 01:17:34,460 --> 01:17:35,760 Ciertas cosas de aquí 1009 01:17:35,760 --> 01:17:42,479 podremos sacar nuestro juego para ordenador para android para web para playstation 4 varias 1010 01:17:42,479 --> 01:17:48,579 plataformas vale eso nos hará tenemos que ir configurando historias pero la importante es 1011 01:17:48,579 --> 01:17:53,319 que todos los niveles que vaya a tener nuestro juego hay que incluirlos en esta en este build 1012 01:17:53,319 --> 01:17:58,479 de escenas vale y cuando decimos build escenas es de un proyecto yo ahora si os fijáis estoy 1013 01:17:58,479 --> 01:18:05,979 creando aquí más escenas pero el proyecto sólo va a tener un gestor de build settings así digamos 1014 01:18:05,979 --> 01:18:11,140 hecho por defecto a través de un menú vale entonces aquí lo que tenemos que ir haciendo 1015 01:18:11,140 --> 01:18:17,199 es ir arrastrando las distintas escenas que van a tener nuestro juego podemos añadir cambiar de 1016 01:18:17,199 --> 01:18:22,779 orden y aquí a la derecha veréis también que tenemos nivel 1 nivel 2 nivel 3 nivel 4 son 1017 01:18:22,779 --> 01:18:28,840 estas cuatro y al irlas incluyendo incluyendo tendrán un índice vale que empezarán y hablamos 1018 01:18:28,840 --> 01:18:34,119 de esto también cuando hablamos de los arrays empezarán por el número 0 la primera escena que 1019 01:18:34,119 --> 01:18:39,340 al menos que estipulemos algo diferente la primera escena que se ejecutará cuando lancemos el juego 1020 01:18:39,340 --> 01:18:45,640 será esta del índice 0 que se llama level 1 pero en realidad esto de level 1 es porque aquí lo 1021 01:18:45,640 --> 01:18:50,000 hemos llamado level 1 si esto se llamará como tutoría aquí cuando arrastro y la pongo aquí 1022 01:18:50,000 --> 01:18:54,300 Y la primerita, pues es tutoría, ¿vale? Esto de level 1 es la convención que yo he usado. 1023 01:18:55,520 --> 01:19:05,399 Para que el Scene Manager pueda usar o pueda llamar a distintos niveles, tienen que estar incluidos en este Scenes in Build. 1024 01:19:05,979 --> 01:19:09,239 Aquí, cuando demos estos botones, será cuando creemos ese ejecutable. 1025 01:19:09,720 --> 01:19:14,439 Pero de momento solo nos interesa esta sección para incluir los niveles que vamos a ir usando. 1026 01:19:15,579 --> 01:19:16,699 ¿Vale? Ahí están preparados. 1027 01:19:16,699 --> 01:19:34,840 Lo he puesto en orden con los índices, pero vamos a ver que eso tampoco es muy importante más allá del primero, que es el que arranca el juego, ¿vale? Entonces, yo estoy en el nivel 1 y le doy a play, bueno, o tutoría, ¿vale? Y cuando acabe tutoría quiero ir a level 2, ¿vale? 1028 01:19:34,840 --> 01:19:42,579 Para eso lo que podemos hacer es que cuando suceda cierta cosa, ¿vale? 1029 01:19:43,720 --> 01:19:51,479 Vamos a usar el SceneManager y su método LoadScene para decirle aquí cuál es el número de índice, 1030 01:19:51,680 --> 01:19:58,640 número de índice, esto que tenemos aquí, de la escena a la que tiene que ir cuando llegue ese punto, ¿vale? 1031 01:19:58,640 --> 01:20:02,920 Si yo quiero ir al nivel 2, realmente tendré que darle el índice 1, ¿no? 1032 01:20:02,920 --> 01:20:05,680 vale, pues vamos a mi nivel 1033 01:20:05,680 --> 01:20:07,880 que es este, y vamos a ir 1034 01:20:07,880 --> 01:20:09,260 a sucesos collider 1035 01:20:09,260 --> 01:20:11,119 que es el objeto que cuando 1036 01:20:11,119 --> 01:20:12,659 vuelvo a abrirlo aquí 1037 01:20:12,659 --> 01:20:15,479 sucesos collider, ¿por qué no me lo abres? 1038 01:20:15,760 --> 01:20:17,619 ¿dónde lo tengo? tengo ya aquí un montón 1039 01:20:17,619 --> 01:20:19,760 de cosas, aquí, cuando sucesos 1040 01:20:19,760 --> 01:20:21,680 collider detecte ese 1041 01:20:21,680 --> 01:20:23,720 trigger, llega aquí y dice, vale, estoy 1042 01:20:23,720 --> 01:20:25,699 a tu disposición, ¿qué hago cuando entra esa bola? 1043 01:20:26,159 --> 01:20:27,539 pues vamos a decir que el 1044 01:20:27,539 --> 01:20:28,380 scene manager 1045 01:20:28,380 --> 01:20:30,340 manager 1046 01:20:30,340 --> 01:20:33,579 loadScene, cargue la escena 1047 01:20:33,579 --> 01:20:35,439 de índice 1 1048 01:20:35,439 --> 01:20:37,420 ¿vale? porque sabemos que 1049 01:20:37,420 --> 01:20:39,380 esta es la escena a la que queremos ir 1050 01:20:39,380 --> 01:20:40,539 entonces 1051 01:20:40,539 --> 01:20:44,670 ya de una forma muy rápida 1052 01:20:44,670 --> 01:20:46,810 me vuelvo a poner en 1053 01:20:46,810 --> 01:20:49,270 para que veamos como llega la bola 1054 01:20:49,270 --> 01:20:50,590 me muevo, me muevo, me muevo 1055 01:20:50,590 --> 01:20:53,710 y ta ta ta ta ta ta 1056 01:20:53,710 --> 01:20:55,210 y cuando se meta, ¡hala! 1057 01:20:55,630 --> 01:20:57,229 ya hemos pasado al nivel 2 y ahora estoy 1058 01:20:57,229 --> 01:20:58,949 fijaos aquí en el nivel 2 1059 01:20:58,949 --> 01:21:01,170 y ya pues tengo el juego del nivel 2 1060 01:21:01,170 --> 01:21:26,050 que es esto, de que muevo la plataforma y la bola gira en base, vamos, se adquiere la inercia en base a él, ¿vale? Esta es la forma rápida para esta tarea de ir incorporando, no dejan de ser números, lo que ponemos aquí, esta forma de cargar la escena, las hay más, ya veremos algunas, pero yo aquí puedo decir que esto sea un int, son números enteros, que se llame número nivel, ¿vale? 1061 01:21:26,050 --> 01:21:55,819 Creo aquí una variable y es la que uso aquí, número nivel, ¿vale? Entonces, yo por ejemplo esto puedo hacerlo serializado o público y decirle, guardo, voy y decirle aquí en el propio inspector que el número del nivel al que vaya sea el 4 o al 3, 4 creo que no había, o al 0 y cargará el primero que había en el build settings, ¿vale? 1062 01:21:55,819 --> 01:22:00,119 Y entonces, de esa forma, podemos decir hacia qué nivel tiene que ir. 1063 01:22:00,220 --> 01:22:04,220 Y ha cargado el nivel 1, que es el mismo, pero el otro que tenía preparado, ¿vale? 1064 01:22:04,220 --> 01:22:04,840 A cambio de escena. 1065 01:22:05,560 --> 01:22:06,579 Esta es la forma rápida. 1066 01:22:07,260 --> 01:22:14,140 Porque, y os voy a abrir el que yo tengo preparado en esta, que hay aquí, bastante más avanzada, ¿vale? 1067 01:22:14,140 --> 01:22:21,420 Es la que tengo en el nivel que yo ya tenía creado para que detecte que la bola ha llegado al trigger de la meta, ¿no? 1068 01:22:21,420 --> 01:22:44,560 Aquí lo que hacemos es un poquillo diferente, pero es básicamente que si he creado un número que es la escena para ir, que es lo mismo que os acabo de decir, pero he hecho otra cosa que es poner en empleo la variable que se genera como argumento del onTrigger o del onCollision. 1069 01:22:44,560 --> 01:23:08,979 ¿Qué significa esto? Y la forma rápida de entenderlo es esto, si voy a un collision me pasará lo mismo, solo que en vez de poner other pone collision, pero tenemos que entender que esta variable, si luego en el interior de este método la nombramos, la apelamos a ella, estamos accediendo a información del objeto que está colisionando contigo o está metiéndose en tu trigger, es decir, con el otro. 1070 01:23:08,979 --> 01:23:20,159 Si este es el cubo que detecta la meta, gracias a este other vamos a poder decir, oye, pero el otro objeto se llama de tal forma o no, porque si no, con este if no pasa esto. 1071 01:23:23,659 --> 01:23:36,800 Cada vez que yo ponga other, aquí dentro, y pongo punto, van a salir propiedades que se pueden usar, como por ejemplo, el nombre de ese otro objeto, el tag, 1072 01:23:36,800 --> 01:23:38,680 que son etiquetas que vamos a poder 1073 01:23:38,680 --> 01:23:40,520 esto también lo veremos en el tema 5 1074 01:23:40,520 --> 01:23:43,100 el tags que podemos ir añadiendo 1075 01:23:43,100 --> 01:23:43,939 para ir discriminando 1076 01:23:43,939 --> 01:23:46,979 lo que he dicho antes, si ponemos un cubo que está tocando 1077 01:23:46,979 --> 01:23:48,319 en todo rato, en todo momento 1078 01:23:48,319 --> 01:23:50,159 el collider de la tabla 1079 01:23:50,159 --> 01:23:52,500 en todo momento está el trigger lanzándose 1080 01:23:52,500 --> 01:23:54,239 o hay un momento ya que se ha lanzado 1081 01:23:54,239 --> 01:23:56,539 pero gracias a esto podemos ir discriminando 1082 01:23:56,539 --> 01:23:58,819 oye, si el nombre del 1083 01:23:58,819 --> 01:24:01,079 gain object del otro, del que está tocando 1084 01:24:01,079 --> 01:24:02,739 el nombre es bola 1085 01:24:02,739 --> 01:24:04,899 hay que meterlo como string y efectivamente 1086 01:24:04,899 --> 01:24:07,020 en el nivel 1087 01:24:07,020 --> 01:24:09,680 en el nivel que tengo aquí 1088 01:24:09,680 --> 01:24:11,739 tengo este objeto 1089 01:24:11,739 --> 01:24:12,659 que es bola, que es la bola 1090 01:24:12,659 --> 01:24:15,560 si es ese objeto 1091 01:24:15,560 --> 01:24:17,119 que se llama bola el que me está tocando 1092 01:24:17,119 --> 01:24:19,479 pues hago este cambio 1093 01:24:19,479 --> 01:24:19,960 de escena 1094 01:24:19,960 --> 01:24:23,399 si se llama 1095 01:24:23,399 --> 01:24:25,199 cualquier otra cosa de la jerarquía 1096 01:24:25,199 --> 01:24:27,260 si es cualquier otro del objeto que está tocando 1097 01:24:27,260 --> 01:24:28,939 pues no, se está activando 1098 01:24:28,939 --> 01:24:30,960 así que se están confluyendo 1099 01:24:30,960 --> 01:24:33,020 que hasta que no haya esta entrada en el trigger 1100 01:24:33,020 --> 01:24:56,420 No se ejecuta lo de dentro, pero es que aunque haya algo que lo toque, podemos discriminar qué es eso que toca. Y fijaos que aquí tengo otro que si el GameObject, bueno, esto no es dentro de un trigger, pero si el propio objeto que tiene el script se llama precipicio, carga el nivel. 1101 01:24:56,420 --> 01:25:10,500 Bueno, esto es un poco más avanzado. Con lo que tenemos aquí ya se puede realizar la tarea. Pero fijaos que hay otra forma aquí, ya os lo cuento, de saber cuál es la escena a la que queremos ir. 1102 01:25:10,500 --> 01:25:33,479 es decir, qué variable, qué contenido damos a este sin2o, que es si el objeto que tengo aquí se llama precipicio, al empezar el script, si el objeto que tiene este código se llama precipicio, aquí no estamos hablando de ningún other, sino del propio objeto que tiene el script, se llama precipicio, y efectivamente, si voy a este nivel hay un elemento que se llama precipicio, 1103 01:25:33,479 --> 01:25:35,060 ¿Qué? Casualidades de la vida 1104 01:25:35,060 --> 01:25:37,060 Es ese que os he dicho que se pone abajo 1105 01:25:37,060 --> 01:25:38,659 Para que detecte que se cae la bola 1106 01:25:38,659 --> 01:25:40,600 Y tiene ese collider que es un trigger 1107 01:25:40,600 --> 01:25:41,840 Para que siga cayendo 1108 01:25:41,840 --> 01:25:45,119 Y detecte que hemos perdido la partida básicamente 1109 01:25:45,119 --> 01:25:46,539 Si este objeto 1110 01:25:46,539 --> 01:25:48,020 Que tiene este script 1111 01:25:48,020 --> 01:25:50,520 ¿Vale? Que se llama precipicio 1112 01:25:50,520 --> 01:25:52,640 Si se llama así este objeto 1113 01:25:52,640 --> 01:25:53,840 Lo que tiene que hacer es 1114 01:25:53,840 --> 01:25:55,500 En la escena 1115 01:25:55,500 --> 01:25:57,500 ¿Vale? Guárdame 1116 01:25:57,500 --> 01:26:00,739 Y es otro de las propiedades, otro de los métodos que tiene el scene manager 1117 01:26:00,739 --> 01:26:02,319 Que es, consigue 1118 01:26:02,319 --> 01:26:08,460 el número de index de la escena activa, es decir, guardan el scene to go, mira y dice 1119 01:26:08,460 --> 01:26:13,380 en qué nivel estoy ahora mismo, y dicen el nivel cuyo index de los build settings es 1, 1120 01:26:13,819 --> 01:26:16,939 pues ya tienes este 1 preparado para que sea este el número. 1121 01:26:18,220 --> 01:26:22,979 Esto es relevante porque nosotros podemos estar definiendo un número al que ir, 1122 01:26:22,979 --> 01:26:27,060 pero de esta forma automáticamente, a lo mejor lo que podemos, si tenemos bien ordenados 1123 01:26:27,060 --> 01:26:33,779 en el build settings, los distintos niveles es, al arrancar el nivel coge en qué nivel estoy ahora mismo, ¿no? 1124 01:26:33,880 --> 01:26:37,699 Get active scene, es decir, la escena en la que me encuentro ahora mismo, y cógeme el número. 1125 01:26:38,279 --> 01:26:44,039 Y digo, cuando llegue a cierto punto, la que quiero que me cargue es ese build index, 1126 01:26:44,239 --> 01:26:48,159 pero no que se recargue a sí misma la escena, que es lo que estaría haciendo en este momento, 1127 01:26:48,319 --> 01:26:54,140 sino que si le ponemos más uno, para pasar de nivel, cuando la bola toque la meta, pues es que va al siguiente nivel. 1128 01:26:54,140 --> 01:26:56,720 ¿vale? entonces hay distintos 1129 01:26:56,720 --> 01:26:58,420 métodos, esto es lo de siempre 1130 01:26:58,420 --> 01:26:59,380 pues que a ver 1131 01:26:59,380 --> 01:27:02,479 mirando la documentación de Unity 1132 01:27:02,479 --> 01:27:04,199 ya os digo que en el siguiente tema 1133 01:27:04,199 --> 01:27:07,020 se habla más de esto, pero si vamos a 1134 01:27:07,020 --> 01:27:08,560 sin 1135 01:27:08,560 --> 01:27:10,239 manager 1136 01:27:10,239 --> 01:27:12,760 Unity 1137 01:27:12,760 --> 01:27:14,720 en el API, en la documentación del 1138 01:27:14,720 --> 01:27:16,699 API, tenemos distintas 1139 01:27:16,699 --> 01:27:18,439 métodos que habría que ir 1140 01:27:18,439 --> 01:27:20,479 pues eso, desde crear una escena 1141 01:27:20,479 --> 01:27:22,500 porque en cierto momento queremos que se 1142 01:27:22,500 --> 01:27:24,300 añade una escena a la que tenemos abierta 1143 01:27:24,300 --> 01:27:26,640 o, oye, coge de la escena 1144 01:27:26,640 --> 01:27:28,640 que está activa, ¿vale? Esto que estábamos cogiendo ahora 1145 01:27:28,640 --> 01:27:30,699 de esta escena activa, pues quiero 1146 01:27:30,699 --> 01:27:31,479 que me cojas 1147 01:27:31,479 --> 01:27:33,359 el build index 1148 01:27:33,359 --> 01:27:36,899 entonces, de getAscendScene 1149 01:27:36,899 --> 01:27:38,439 ¿vale? Y aparte tiene luego 1150 01:27:38,439 --> 01:27:40,659 sus propios parámetros. Quiero que de esa escena 1151 01:27:40,659 --> 01:27:42,579 me cojas el nombre, ¿vale? 1152 01:27:42,640 --> 01:27:44,279 Entonces, pues ahí se puede 1153 01:27:44,279 --> 01:27:46,300 se pueden ir guardando 1154 01:27:46,300 --> 01:27:48,460 valores relacionados con la escena 1155 01:27:48,460 --> 01:27:50,500 Simplemente que sepáis 1156 01:27:50,500 --> 01:27:51,619 que para cargar una escena 1157 01:27:51,619 --> 01:28:18,520 Ahora, si no queremos recurrir a los números de, aunque tienen que estar en los build settings también, ahí metido, si en vez del número del índice queremos usar el nombre, también se puede decir un array que sea el nombre del nivel, por ejemplo, level 2 creo que se llamaba, y entonces va a buscar dentro de todos los que haya, level 2, pero era junto, va a buscar dentro de todos los que haya aquí los build settings, el que se llame como eso y cargará ese por nombre, ¿vale? 1158 01:28:18,520 --> 01:28:24,800 Entonces yo aquí puedo poner level 2 y ahora sería el que cargaría, ¿vale? 1159 01:28:24,800 --> 01:28:33,159 El level 2, no estamos invalidando porque no estamos usando esto del número para la escena, pero estaría ahí, ¿vale? 1160 01:28:33,479 --> 01:28:34,479 Lo dejo un poco como estaba. 1161 01:28:35,960 --> 01:28:40,979 Y hasta aquí, en el primer nivel ya no deberíais tener dificultades para irlo sacando. 1162 01:28:41,439 --> 01:28:44,460 En el segundo hay algún pero más. 1163 01:28:44,460 --> 01:29:01,380 En el nivel 1 la tabla está estática y si os fijáis el terreno no tiene ningún script, no está desactivado y por tanto lo que se mueve es la bola, pero en los siguientes niveles lo que se mueve es la tabla, entonces a la que hay que darle el script es a la tabla. 1164 01:29:01,380 --> 01:29:25,460 Es la que va a tener, lo que os lo he enseñado antes, de hecho, es la que va a tener, a ver, terreno move, pues eso, el torque. Esto os lo he enseñado antes, el torque que añadirá fuerza para que rote. La bola estará encima y por inercia, ahora es la bola, de hecho, la que tiene su script de movimiento desactivado porque no quiero que se mueva con la cruceta que tengo establecida en el input manager para el movimiento de la bola. 1165 01:29:25,460 --> 01:29:46,300 Quiero que sea plenamente solidaria, que reciba la inercia según la inclinación de la tabla. Pero hay un problema, que es que esta tabla, igual que hemos hecho antes, tiene un MES Collider que considera que tiene un agujero para que no pase lo de antes de que no se meta la bola. 1166 01:29:46,300 --> 01:30:15,600 ¿Qué problema hay? Que para aplicar fuerzas al terreno, y por tanto le tenemos que poner un RigidBody, a diferencia del nivel 1, que no hace falta un RigidBody, va a ser un objeto estático, cuando metemos un MeshCollider, para que coja esta geometría con el RigidBody, el RigidBody va a salir un error que va a implicar que tenga que estar en kinemático. 1167 01:30:16,300 --> 01:30:26,579 Si no, veis que no se ve aplicado y no funcionaría. De hecho, si lo quito y le doy a play, o dará error o se sumergirá en la tabla. 1168 01:30:26,579 --> 01:30:45,939 ¿Veis? Esta bola. Entonces, intentadlo, pero va a haber un problema, que es que es imposible que con un solo GameObject podáis aplicar la rotación en el RigidBody para que se mueva y que el MeshCollider respete el agujero. 1169 01:30:46,300 --> 01:31:04,960 Para esto, y es la dificultad y está hecho a posta, normalmente no se llega a estos escenarios porque no queremos mover por físicas algo que tiene una malla más detallada, hay que disgregar en dos elementos esta tabla. 1170 01:31:04,960 --> 01:31:22,220 Por un lado, un elemento padre que si os fijáis no tiene nada de geometría, no tiene ni MeshFilter ni MeshRenderer, se podría llamar también MovedorTerreno, que lo que tiene es un RigidBody para efectivamente que este script mueva este RigidBody y haga que se gire, ¿vale? 1171 01:31:22,220 --> 01:31:32,880 y luego un hijo, que al ser hijo va heredando la posición de su padre, en el que sí que esté este RigidBody, pero no está el movimiento por código, ¿vale? 1172 01:31:32,880 --> 01:31:42,600 Y en este sí que podéis activar un MeshCollider sin el convex, ¿vale? Para que sí que, para que no sea, cuando leáis los apuntes veréis que puede estar en modo convex, 1173 01:31:42,600 --> 01:31:47,479 que intenta minimizar o reducir directamente la geometría, 1174 01:31:47,939 --> 01:31:52,520 pero nuevamente hace eso de que lo convierte en un elemento que no tiene el agujero 1175 01:31:52,520 --> 01:31:58,479 y si queremos que mantenga ese convex, pues hay que añadir un rigidbody que sea de tipo kinemático 1176 01:31:58,479 --> 01:32:02,399 y cuando hacemos eso ya no se puede mover por código este rigidbody. 1177 01:32:03,100 --> 01:32:08,920 Entonces lo que hacemos es mover ese movimiento de físicas, lo hacemos en un padre y lo hereda el hijo 1178 01:32:08,920 --> 01:32:13,279 que es el que sí tiene el collider y la geometría de ese agujero. 1179 01:32:14,159 --> 01:32:19,819 Esta es la mayor dificultad, pero sabiendo esto un poco en cuenta y teniéndolo en cuenta, 1180 01:32:20,180 --> 01:32:23,579 creo que ya resulta gran parte. 1181 01:32:24,000 --> 01:32:30,840 Fijaos que es este tipo de error, los non-convex mescollider con no kinematic rebody 1182 01:32:30,840 --> 01:32:33,500 no se soportan desde hace tiempo. 1183 01:32:33,500 --> 01:32:35,739 ¿vale? entonces hay que ir 1184 01:32:35,739 --> 01:32:37,739 bueno pues 1185 01:32:37,739 --> 01:32:39,779 ir ajustando, bueno ahora mismo lo tengo 1186 01:32:39,779 --> 01:32:41,739 bien, cuando dé a play este error se va a 1187 01:32:41,739 --> 01:32:43,420 marchar, ¿vale? 1188 01:32:43,619 --> 01:32:44,960 pero si 1189 01:32:44,960 --> 01:32:47,520 desactivar a lo de kinemático para que 1190 01:32:47,520 --> 01:32:49,600 por ejemplo se pudieran aplicar esas fuerzas 1191 01:32:49,600 --> 01:32:51,060 pues cuando dé a play 1192 01:32:51,060 --> 01:32:53,380 va a funcionar pero no va a estar 1193 01:32:53,380 --> 01:32:55,960 no está aplicándose ese 1194 01:32:55,960 --> 01:32:57,520 ese collider 1195 01:32:57,520 --> 01:32:58,539 de manera correcta, ¿vale? 1196 01:32:59,960 --> 01:33:04,039 entonces ahí lo tenemos 1197 01:33:04,039 --> 01:33:05,239 ¿vale? 1198 01:33:05,699 --> 01:33:06,699 Gracias.