1 00:00:07,150 --> 00:00:15,410 Algo que tenemos que empezar ya a manejar es no solo los nombres de los objetos, sino también sus etiquetas, porque nos servirán en adelante mucho. 2 00:00:16,089 --> 00:00:26,989 Pensemos, por ejemplo, en todos los NPCs o todos los malos que tenemos en nuestra escena y no podemos estar diciendo si se ha chocado con el malo 1, si se ha chocado con el malo 2, si se ha chocado con el malo 3. 3 00:00:28,089 --> 00:00:34,090 O hay muchos tipos de malos y no le podemos estar indicando con cuáles puede chocar o con cuáles puede morir si se choca. 4 00:00:34,090 --> 00:00:41,469 entonces para eso están las etiquetas yo puedo crear una etiqueta llamada por ejemplo malo o 5 00:00:41,469 --> 00:00:48,649 zombi y asignarle a todos mis zombies esa etiqueta y cuando le entra el collider le podemos decir si 6 00:00:48,649 --> 00:00:53,810 el objeto con el que ha chocado tiene la etiqueta zombi pues entonces muerte las etiquetas las 7 00:00:53,810 --> 00:01:00,670 tenemos aquí en todo objeto veremos que tiene un nombre el que yo estoy ahora mismo y una etiqueta 8 00:01:00,670 --> 00:01:03,909 que ahora mismo este objeto por ejemplo no tiene ninguna etiqueta tenemos algunas etiquetas ya 9 00:01:03,909 --> 00:01:12,280 predefinidas por ejemplo le puedo decir que añade una etiqueta y le podemos añadir una etiqueta nueva 10 00:01:12,280 --> 00:01:16,739 por ejemplo le puedo llamar obstáculo ahora tengo aquí una etiqueta aparte de las que ya había 11 00:01:16,739 --> 00:01:20,760 preconfiguradas que se llama obstáculo y le puedo poner que tenga la etiqueta obstáculo es decir 12 00:01:20,760 --> 00:01:27,599 ahora mismo este objeto tiene la etiqueta obstáculo y lo que he hecho yo antes de preguntarle si el 13 00:01:27,599 --> 00:01:31,379 elemento con el que he chocado tiene el nombre suelo pues también le podemos preguntar si el 14 00:01:31,379 --> 00:01:38,640 objeto con el que es chocado no su nombre sino su etiqueta lo tenemos ahí pues es obstáculo 15 00:01:38,640 --> 00:01:43,379 muy importante estas etiquetas que ponemos aquí tienen que estar predefinidas si no nos daría 16 00:01:43,379 --> 00:01:53,230 error cuando en la esfera choque la vemos cayendo desaparece truco esto es adelantarme un poquito 17 00:01:53,230 --> 00:01:59,430 pero más adelante nos encontraremos con un problema y es que cuando nosotros damos el 18 00:01:59,430 --> 00:02:03,989 método Destroy en Unity, lo que estamos haciendo es eliminar completamente el GameObject de la 19 00:02:03,989 --> 00:02:08,629 escena. De hecho, si nos fijamos en la jerarquía veremos que desaparece. A veces no queremos eso, 20 00:02:08,629 --> 00:02:15,090 a veces directamente lo que ocurre es que creemos que desaparezca, pero sustituirlo a lo mejor por 21 00:02:15,090 --> 00:02:20,330 un sistema de partículas como una explosión, pero que a lo mejor ciertos componentes de ese 22 00:02:20,330 --> 00:02:26,930 GameObject sigan vigentes, como por ejemplo sus sonidos, o que los malos le sigan detectando, 23 00:02:26,930 --> 00:02:31,909 En fin, muchas veces nos interesa que siga en la escena, con lo cual lo de destruirlo no nos viene bien. 24 00:02:32,270 --> 00:02:34,330 Para eso, por ejemplo, existen otros métodos. 25 00:02:35,490 --> 00:02:37,849 El más cómodo es, por ejemplo, desactivar su renderizado. 26 00:02:38,310 --> 00:02:44,030 Si nos fijamos aquí, cualquier objeto, me voy a ir a la esfera, tiene aquí un MeshRenderer que lo que hace es que renderiza el objeto. 27 00:02:44,030 --> 00:02:49,490 Si nosotros eso lo desactivamos, veremos que desaparece de la escena, pero sigue existiendo aquí en la jerarquía. 28 00:02:49,870 --> 00:02:52,610 Pues bien, ese MeshRenderer lo podemos también capturar y es bastante sencillo. 29 00:02:52,650 --> 00:02:56,289 Lo voy a hacer, aunque insisto que esto nos vendrá bien más adelante, pero ahora me viene muy bien. 30 00:02:56,289 --> 00:03:04,229 en el que yo puedo crear una variable serializada de tipo MeshRenderer 31 00:03:04,229 --> 00:03:07,990 y le voy a llamar MyMesh, por ejemplo. 32 00:03:10,560 --> 00:03:15,300 Y aquí, en vez de destruir un objeto, lo que voy a decir es que esa MeshRenderer, 33 00:03:17,340 --> 00:03:20,000 su propiedad enable sea false, es decir, que se desactive. 34 00:03:21,460 --> 00:03:25,539 Y ahora veremos en Unity, lo que tengo que hacer, lógicamente, 35 00:03:25,639 --> 00:03:29,419 es en esa variable que le está pidiendo un MeshRenderer que sea el MeshRenderer de la propia esfera, 36 00:03:29,419 --> 00:03:33,979 y veremos que cuando choque con el suelo esta casilla desaparecerá, o sea, se desactivará. 37 00:03:34,520 --> 00:03:37,099 Y la esfera seguirá existiendo. 38 00:03:38,240 --> 00:03:39,020 Ahí está, cae. 39 00:03:40,219 --> 00:03:42,580 Y sigue cayendo la esfera, sigue aquí en la jerarquía. 40 00:03:42,719 --> 00:03:44,639 Lo que pasa es que se ha desactivado el Mesh Renderer. 41 00:03:45,020 --> 00:03:46,680 En fin, que esto nos será bastante útil. 42 00:03:47,560 --> 00:03:48,740 Pero vayamos a otro nivel. 43 00:03:49,240 --> 00:03:54,319 Muchas veces no nos interesa solo detectar la colisión y actuar en consecuencia, 44 00:03:54,319 --> 00:03:57,740 sino que a veces necesitamos muchos más datos con respecto a esa colisión. 45 00:03:57,740 --> 00:04:09,460 Para eso, entonces, Unity no utiliza la variable Collider, sino otra más, que es el Collision, que nos da muchos datos sobre el objeto con el que ha colisionado y las condiciones en las que se han producido. 46 00:04:09,979 --> 00:04:21,019 Velocidad en la que ha colisionado, en qué punto, en qué malla exactamente ha colisionado, para si tenemos que decidir si ha sido en el brazo o en la pierna, o incluso dónde ha dado en el otro objeto. 47 00:04:21,019 --> 00:04:27,259 En fin, muchos datos que nos vienen muy bien. El ángulo en el que ha chocado, y es para eso que utilizaremos el método Collision. 48 00:04:27,259 --> 00:04:29,519 vamos a ver cómo funciona. Para eso miré 49 00:04:29,519 --> 00:04:31,759 el código y en vez de utilizar 50 00:04:31,759 --> 00:04:32,800 el onTriggerEnter 51 00:04:32,800 --> 00:04:37,120 voy a hacerlo igual que antes, pero en este caso 52 00:04:37,120 --> 00:04:39,439 le voy a decir que onCollisionEnter 53 00:04:39,439 --> 00:04:41,199 y como podemos ver, de nuevo me ha rellenado todo 54 00:04:41,199 --> 00:04:43,019 es una método CollisionEnter 55 00:04:43,019 --> 00:04:45,000 donde crea una variable llamada 56 00:04:45,000 --> 00:04:46,680 Collision que tiene todos los datos de la colisión 57 00:04:46,680 --> 00:04:48,959 ¿Cuáles son esos datos? Son muchos, entonces 58 00:04:48,959 --> 00:04:51,019 no me puedo entretener aquí, pero vamos, yo iría a la página 59 00:04:51,019 --> 00:04:53,160 de Unity y preguntaría cuántos, qué datos tengo de esa colisión 60 00:04:53,160 --> 00:04:55,019 pero en cualquier caso, a efectos 61 00:04:55,019 --> 00:04:56,839 prácticos funciona igual, en el que yo le puedo decir, sí 62 00:04:56,839 --> 00:05:00,680 el GameObject con el que ha chocado 63 00:05:00,680 --> 00:05:02,259 tiene la etiqueta 64 00:05:02,259 --> 00:05:08,959 obstáculo, pues 65 00:05:08,959 --> 00:05:10,600 lo mismo que he hecho antes. 66 00:05:11,439 --> 00:05:11,839 Desactivo 67 00:05:11,839 --> 00:05:14,120 la malla. 68 00:05:19,259 --> 00:05:20,000 Dejado ahí un igual. 69 00:05:21,740 --> 00:05:23,300 Volvemos a Unity, pero eso sí, muy importante 70 00:05:23,300 --> 00:05:24,800 antes de seguir. Para que 71 00:05:24,800 --> 00:05:27,300 poder usar el método 72 00:05:27,300 --> 00:05:28,980 de colisión, tenemos que desactivar el 73 00:05:28,980 --> 00:05:30,519 IsTrigger de nuestro SphereCollider. 74 00:05:30,939 --> 00:05:32,680 Porque si no, no detectará una colisión. 75 00:05:32,819 --> 00:05:34,779 Sencillamente se lanzará el disparador, que es lo que hacía antes. 76 00:05:34,779 --> 00:05:47,639 Ahora sí, ahora sí quiero que actúe como un objeto físico, pero quiero detectar la colisión, donde yo le puedo decir que, de nuevo, si el tag del objeto con el que he chocado es obstáculo, pues que desactive el renderizado. 77 00:05:48,540 --> 00:06:01,420 Vamos allá. Y le pasará exactamente lo mismo. Ahí está. Vemos que sigue existiendo el objeto, vemos que ha rebotado, porque lo que ha hecho es desactivar la malla, pero ha desaparecido, porque lo ha detectado. 78 00:06:02,360 --> 00:06:06,879 Vamos a comprobar qué ocurre si yo le digo que el GameObjectTag es obstáculo, no, es zombie. 79 00:06:08,199 --> 00:06:18,980 Pues lógicamente Unity, la esfera, cuando choque contra el suelo, detectará que el objeto con el que ha chocado no tiene la etiqueta zombie y actuará como si no hubiese pasado nada. 80 00:06:21,170 --> 00:06:34,290 Pero es que el método colisión nos permite muchas más cosas, como por ejemplo detectar las velocidades de los objetos, tanto del objeto que llega como del objeto con el que colisiona, o incluso las velocidades relativas, por si se da la circunstancia de que las dos se dirigen en la misma dirección, entonces la velocidad relativa es menor. 81 00:06:34,990 --> 00:06:43,069 Vamos a comprobarlo, por ejemplo, le voy a decir que me muestre en pantalla la variable colisión, concretamente su velocidad relativa, 82 00:06:43,329 --> 00:06:49,829 pero veremos que esto no es más que otra clase, que tiene muchos datos, como por ejemplo la dirección en la que se ha producido, los vectores y demás, 83 00:06:49,829 --> 00:06:57,670 o incluso el eje en el que se está moviendo, pero yo lo que quiero es su magnitud, es decir, el dato concreto de a qué velocidad se movía. 84 00:06:58,370 --> 00:07:05,019 Es decir, que si lo lanzo, vemos que en consola me aparece 14, 5, 2, 0. 85 00:07:05,259 --> 00:07:06,579 Porque lógicamente ha rebotado varias veces. 86 00:07:07,220 --> 00:07:08,920 Pero en el primer impacto, por ejemplo, ha impactado en 14. 87 00:07:10,060 --> 00:07:11,899 Ahí lo tenemos. Esa es su velocidad relativa. 88 00:07:12,420 --> 00:07:16,360 ¿Esto qué nos permite? Pues, por ejemplo, vincular el daño a la velocidad con la que me choco. 89 00:07:17,160 --> 00:07:19,399 Lo vamos a comprobar ahora mismo. Por ejemplo, le voy a decir que sí. 90 00:07:19,399 --> 00:07:24,680 si la magnitud de la velocidad relativa 91 00:07:24,680 --> 00:07:26,680 con la que colisiono es 92 00:07:26,680 --> 00:07:27,920 mayor 93 00:07:27,920 --> 00:07:29,600 que 15 94 00:07:29,600 --> 00:07:32,279 destruya el objeto 95 00:07:32,279 --> 00:07:34,500 aquí sí 96 00:07:34,500 --> 00:07:35,639 que lo destruya directamente 97 00:07:35,639 --> 00:07:39,689 y antes de que lo destruya 98 00:07:39,689 --> 00:07:42,709 voy a mandar a la pantalla para asegurarme que todo ha funcionado bien 99 00:07:42,709 --> 00:07:44,410 le digo que me muestre en consola 100 00:07:44,410 --> 00:07:46,930 la velocidad a la que ha chocado 101 00:07:46,930 --> 00:07:48,689 y efectivamente si yo lanzo la pelota 102 00:07:48,689 --> 00:07:49,490 desde arriba 103 00:07:49,490 --> 00:07:53,589 me dice que ha chocado a 14,8 104 00:07:53,589 --> 00:07:56,050 y ahí sigue la pelota. ¿Qué ocurre si yo cojo 105 00:07:56,050 --> 00:07:57,009 la pelota original 106 00:07:57,009 --> 00:08:00,089 y la desplazo más hacia arriba? 107 00:08:01,850 --> 00:08:03,209 ¿Y la lanzo desde el cielo? 108 00:08:04,750 --> 00:08:06,129 Pues obviamente irá cogiendo 109 00:08:06,129 --> 00:08:08,250 aceleración a medida que cae y su velocidad 110 00:08:08,250 --> 00:08:09,730 de impacto será mayor. 111 00:08:10,029 --> 00:08:10,490 Ahora lo veremos. 112 00:08:11,769 --> 00:08:14,110 Y desaparece. Efectivamente. ¿Por qué? Porque su velocidad 113 00:08:14,110 --> 00:08:15,269 de impacto ha sido 18. 114 00:08:15,610 --> 00:08:18,209 Quedémonos con que las opciones en cuanto a las colisiones 115 00:08:18,209 --> 00:08:20,069 son tremendas. Desde los 116 00:08:20,069 --> 00:08:22,250 colliders que nos permiten lanzar un disparador 117 00:08:22,250 --> 00:08:26,550 y en función de eso actuar, o algo mucho más complejo como son las colisiones, 118 00:08:26,649 --> 00:08:30,730 donde, insisto, nos puede dar un array con los puntos en los que ha colisionado, 119 00:08:31,089 --> 00:08:37,669 la velocidad relativa con la que ha colisionado, el vector de dirección con el que ha colisionado, 120 00:08:37,809 --> 00:08:44,049 pensemos en proyectiles, en fin, todo eso lo tenemos a nuestro alcance y solo tenemos que animarnos a usarlo.