Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Primeros pasos en Unity. Colisiones (parte 2) - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Además de detectar colisiones mediante el método Trigger, podemos hacerlo usando el método Collision para objetos con presencia física
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:
- 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