Saltar navegación

Activa JavaScript para disfrutar de los vídeos de la Mediateca.

Primeros pasos en Unity. Colisiones (parte 2) - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 6 de octubre de 2024 por Alvaro H.

76 visualizaciones

Además de detectar colisiones mediante el método Trigger, podemos hacerlo usando el método Collision para objetos con presencia física

Descargar la transcripción

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. 00:00:07
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. 00:00:16
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. 00:00:28
entonces para eso están las etiquetas yo puedo crear una etiqueta llamada por ejemplo malo o 00:00:34
zombi y asignarle a todos mis zombies esa etiqueta y cuando le entra el collider le podemos decir si 00:00:41
el objeto con el que ha chocado tiene la etiqueta zombi pues entonces muerte las etiquetas las 00:00:48
tenemos aquí en todo objeto veremos que tiene un nombre el que yo estoy ahora mismo y una etiqueta 00:00:53
que ahora mismo este objeto por ejemplo no tiene ninguna etiqueta tenemos algunas etiquetas ya 00:01:00
predefinidas por ejemplo le puedo decir que añade una etiqueta y le podemos añadir una etiqueta nueva 00:01:03
por ejemplo le puedo llamar obstáculo ahora tengo aquí una etiqueta aparte de las que ya había 00:01:12
preconfiguradas que se llama obstáculo y le puedo poner que tenga la etiqueta obstáculo es decir 00:01:16
ahora mismo este objeto tiene la etiqueta obstáculo y lo que he hecho yo antes de preguntarle si el 00:01:20
elemento con el que he chocado tiene el nombre suelo pues también le podemos preguntar si el 00:01:27
objeto con el que es chocado no su nombre sino su etiqueta lo tenemos ahí pues es obstáculo 00:01:31
muy importante estas etiquetas que ponemos aquí tienen que estar predefinidas si no nos daría 00:01:38
error cuando en la esfera choque la vemos cayendo desaparece truco esto es adelantarme un poquito 00:01:43
pero más adelante nos encontraremos con un problema y es que cuando nosotros damos el 00:01:53
método Destroy en Unity, lo que estamos haciendo es eliminar completamente el GameObject de la 00:01:59
escena. De hecho, si nos fijamos en la jerarquía veremos que desaparece. A veces no queremos eso, 00:02:03
a veces directamente lo que ocurre es que creemos que desaparezca, pero sustituirlo a lo mejor por 00:02:08
un sistema de partículas como una explosión, pero que a lo mejor ciertos componentes de ese 00:02:15
GameObject sigan vigentes, como por ejemplo sus sonidos, o que los malos le sigan detectando, 00:02:20
En fin, muchas veces nos interesa que siga en la escena, con lo cual lo de destruirlo no nos viene bien. 00:02:26
Para eso, por ejemplo, existen otros métodos. 00:02:32
El más cómodo es, por ejemplo, desactivar su renderizado. 00:02:35
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. 00:02:38
Si nosotros eso lo desactivamos, veremos que desaparece de la escena, pero sigue existiendo aquí en la jerarquía. 00:02:44
Pues bien, ese MeshRenderer lo podemos también capturar y es bastante sencillo. 00:02:49
Lo voy a hacer, aunque insisto que esto nos vendrá bien más adelante, pero ahora me viene muy bien. 00:02:52
en el que yo puedo crear una variable serializada de tipo MeshRenderer 00:02:56
y le voy a llamar MyMesh, por ejemplo. 00:03:04
Y aquí, en vez de destruir un objeto, lo que voy a decir es que esa MeshRenderer, 00:03:10
su propiedad enable sea false, es decir, que se desactive. 00:03:17
Y ahora veremos en Unity, lo que tengo que hacer, lógicamente, 00:03:21
es en esa variable que le está pidiendo un MeshRenderer que sea el MeshRenderer de la propia esfera, 00:03:25
y veremos que cuando choque con el suelo esta casilla desaparecerá, o sea, se desactivará. 00:03:29
Y la esfera seguirá existiendo. 00:03:34
Ahí está, cae. 00:03:38
Y sigue cayendo la esfera, sigue aquí en la jerarquía. 00:03:40
Lo que pasa es que se ha desactivado el Mesh Renderer. 00:03:42
En fin, que esto nos será bastante útil. 00:03:45
Pero vayamos a otro nivel. 00:03:47
Muchas veces no nos interesa solo detectar la colisión y actuar en consecuencia, 00:03:49
sino que a veces necesitamos muchos más datos con respecto a esa colisión. 00:03:54
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. 00:03:57
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. 00:04:09
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. 00:04:21
vamos a ver cómo funciona. Para eso miré 00:04:27
el código y en vez de utilizar 00:04:29
el onTriggerEnter 00:04:31
voy a hacerlo igual que antes, pero en este caso 00:04:32
le voy a decir que onCollisionEnter 00:04:37
y como podemos ver, de nuevo me ha rellenado todo 00:04:39
es una método CollisionEnter 00:04:41
donde crea una variable llamada 00:04:43
Collision que tiene todos los datos de la colisión 00:04:45
¿Cuáles son esos datos? Son muchos, entonces 00:04:46
no me puedo entretener aquí, pero vamos, yo iría a la página 00:04:48
de Unity y preguntaría cuántos, qué datos tengo de esa colisión 00:04:51
pero en cualquier caso, a efectos 00:04:53
prácticos funciona igual, en el que yo le puedo decir, sí 00:04:55
el GameObject con el que ha chocado 00:04:56
tiene la etiqueta 00:05:00
obstáculo, pues 00:05:02
lo mismo que he hecho antes. 00:05:08
Desactivo 00:05:11
la malla. 00:05:11
Dejado ahí un igual. 00:05:19
Volvemos a Unity, pero eso sí, muy importante 00:05:21
antes de seguir. Para que 00:05:23
poder usar el método 00:05:24
de colisión, tenemos que desactivar el 00:05:27
IsTrigger de nuestro SphereCollider. 00:05:28
Porque si no, no detectará una colisión. 00:05:30
Sencillamente se lanzará el disparador, que es lo que hacía antes. 00:05:32
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. 00:05:34
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. 00:05:48
Vamos a comprobar qué ocurre si yo le digo que el GameObjectTag es obstáculo, no, es zombie. 00:06:02
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. 00:06:08
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. 00:06:21
Vamos a comprobarlo, por ejemplo, le voy a decir que me muestre en pantalla la variable colisión, concretamente su velocidad relativa, 00:06:34
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, 00:06:43
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. 00:06:49
Es decir, que si lo lanzo, vemos que en consola me aparece 14, 5, 2, 0. 00:06:58
Porque lógicamente ha rebotado varias veces. 00:07:05
Pero en el primer impacto, por ejemplo, ha impactado en 14. 00:07:07
Ahí lo tenemos. Esa es su velocidad relativa. 00:07:10
¿Esto qué nos permite? Pues, por ejemplo, vincular el daño a la velocidad con la que me choco. 00:07:12
Lo vamos a comprobar ahora mismo. Por ejemplo, le voy a decir que sí. 00:07:17
si la magnitud de la velocidad relativa 00:07:19
con la que colisiono es 00:07:24
mayor 00:07:26
que 15 00:07:27
destruya el objeto 00:07:29
aquí sí 00:07:32
que lo destruya directamente 00:07:34
y antes de que lo destruya 00:07:35
voy a mandar a la pantalla para asegurarme que todo ha funcionado bien 00:07:39
le digo que me muestre en consola 00:07:42
la velocidad a la que ha chocado 00:07:44
y efectivamente si yo lanzo la pelota 00:07:46
desde arriba 00:07:48
me dice que ha chocado a 14,8 00:07:49
y ahí sigue la pelota. ¿Qué ocurre si yo cojo 00:07:53
la pelota original 00:07:56
y la desplazo más hacia arriba? 00:07:57
¿Y la lanzo desde el cielo? 00:08:01
Pues obviamente irá cogiendo 00:08:04
aceleración a medida que cae y su velocidad 00:08:06
de impacto será mayor. 00:08:08
Ahora lo veremos. 00:08:10
Y desaparece. Efectivamente. ¿Por qué? Porque su velocidad 00:08:11
de impacto ha sido 18. 00:08:14
Quedémonos con que las opciones en cuanto a las colisiones 00:08:15
son tremendas. Desde los 00:08:18
colliders que nos permiten lanzar un disparador 00:08:20
y en función de eso actuar, o algo mucho más complejo como son las colisiones, 00:08:22
donde, insisto, nos puede dar un array con los puntos en los que ha colisionado, 00:08:26
la velocidad relativa con la que ha colisionado, el vector de dirección con el que ha colisionado, 00:08:31
pensemos en proyectiles, en fin, todo eso lo tenemos a nuestro alcance y solo tenemos que animarnos a usarlo. 00:08:37
Idioma/s:
es
Autor/es:
Álvaro Holguera
Subido por:
Alvaro H.
Licencia:
Reconocimiento - No comercial - Sin obra derivada
Visualizaciones:
76
Fecha:
6 de octubre de 2024 - 20:34
Visibilidad:
Público
Centro:
CFP JOSÉ LUIS GARCI
Duración:
08′ 44″
Relación de aspecto:
1.78:1
Resolución:
1280x720 píxeles
Tamaño:
175.68 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid