#3 Tipos de Colliders. Interacción con RigidBody. [Laberinto en Primera Persona]

Por GameDevTraum

Introducción

En este artículo vamos a ver los diferentes tipos de Colliders y cómo aplicarlos a nuestro modelos 3D, además vemos cómo interactúan con la componente RigidBody. Los Colliders nos permiten, por ejemplo, evitar que un personaje atraviese objetos o paredes en Unity.

Página principal del proyecto

Artículos de la Serie del Laberinto

Antes de comenzar te invito a ver el video 3 de la serie del Laberinto.



¿Qué son los Colliders en Unity?

Los Colliders son componentes que podemos asignar a nuestros GameObjects y que permiten que puedan colisionar con otros GameObjects que también tienen asignado Colliders.

Son importantes para lograr colisiones en física, ya que trabajarán en conjunto con las componentes RigidBody. Además nos sirven para limitar los espacios en los que los GameObjects pueden moverse.

Tipos de Colliders en Unity

Comenzamos despejando la escena de los GameObjects que quedaron en el video anterior. Vamos a dejar el pedestal con la espada y el reloj, para poder analizar los distintos tipos de Colliders.

escena de unity3d se observa un suelo con textura de cesped
Fig. 1: Estado inicial de la escena para comenzar a trabajar.

La espada y el pedestal son dos objetos separados agrupados bajo un mismo padre, así que podemos seleccionar la espada y apartarla del pedestal (figuras 2 y 3).

escena en unity3d un pedestal con una espada y un reloj de péndulo
Fig. 2: El GameObject espada se encuentra seleccionado en la jerarquía.
escena en unity3d un pedestal con una espada y un reloj de péndulo
Fig. 3: El GameObject espada se aparta del pedestal.

Además vamos a crear un cubo y una esfera haciendo clic derecho en la jerarquía y usando el menú 3D Object. Acomodamos los objetos para que se vean como en la figura 4.

escena en unity3d se observa un suelo con textura de cesped con margaritas. una espada, un cubo blanco y una esfera blanca.
Fig. 4: Arreglo de GameObjects para analizar los distintos tipos de Colliders.

Con el cubo seleccionado, observamos sus propiedades en el inspector. Por defecto viene con varias propiedades incluidas, entre ellas se encuentra una componente Box Collider.

inspector de un gameobject cubo en unity3d
Fig. 5: Visualización del inspector de un GameObject tipo cubo.

Las componentes podemos eliminarlas utilizando el pequeño engranaje de la parte superior derecha de una componente y haciendo clic en Remove Component, como se observa en la figura 6.

inspector de un gameobject cubo en unity3d. aparece un menú que permite eliminar el componente
Fig. 6: Haciendo clic en el engranaje de la esquina superior derecha podemos eliminar un componente.

En la siguiente figura vemos que la componente Box Collider se ha eliminado.

inspector de un gameobject cubo sin box collider en unity3d
Fig. 7: El Box Collider ha sido eliminado de las componentes.

Podemos agregar nuevas componentes a nuestros GameObjects haciendo clic en el botón “Add Component”, al hacerlo se nos despliega una ventana con todas las componentes y que cuenta con una barra de búsqueda. Si escribimos “Collider” en la barra de búsqueda podemos observar los distintos tipos de Collider que podemos añadir a nuestro GameObject.

Por supuesto hay Colliders que son más apropiados que otros para un GameObject en particular, esto va a depender de la geometría del GameObject y del uso que vayamos a darle.

inspector de un gameobject cubo en unity3d. el menu add component está desplegado.
Fig. 8: Al pulsar el botón Add Component nos aparece una lista con todos los componentes que podemos agregar al GameObject.

Vamos a desactivar el componente MeshRenderer del cubo para observar mejor el Collider, las componentes suelen traer una pequeña casilla a la izquierda de su nombre para activarlas o desactivarlas.

En la figura 9 observamos que el Box Collider se representa como un Cubo definido por aristas de color verde. Debido a que el GameObject es un cubo, este tipo de Collider encaja perfectamente en su geometría.

una escena de unity 3d con un suelo con una textura de cesped con margaritas, se observa una esfera blanca y aristas color verde de un cubo.
Fig. 9: Al apagar el componente Mesh Renderer del GameObject cubo podemos visualizar el Box Collider.

Ahora seleccionemos en la jerarquía el GameObject esfera y veamos sus propiedades en el inspector.

Esta vez tiene asignado un tipo de Collider esférico.

inspector de un gameobject esfera en unity3d
Fig. 10: Visualización del inspector de un GameObject tipo esfera.

Nuevamente desactivamos el componente Mesh Renderer para observar el Collider (figura 11). De nuevo, como se trata de un GameObject esférico el tipo de Collider esférico se ajusta perfectamente a su geometría.

escena en unity3d con un suelo con textura de cesped con margaritas. se observa una esfera definida por líneas color verde. collider esférico.
Fig. 11: Al apagar el componente Mesh Renderer del GameObject esfera podemos visualizar el Sphere Collider.

Veamos que pasa con la espada, la seleccionamos en la jerarquía y observamos sus propiedades en el inspector. A diferencia de los dos GameObjects anteriores, la espada no trae asignado un Collider por defecto, debemos asignar uno manualmente como se mostró en la figura 8.

escena en unity 3d suelo con textura de cesped con margaritas, una espada apuntando hacia abajo y medio reloj.
Fig. 12: Seleccionamos la espada que previamente desplazamos del pedestal.

Primero asignamos un Box Collider. En este caso como se observa en la figura 13, vemos que aparece una caja con el mínimo volumen necesario para contener totalmente el GameObject espada.

escena en unity 3d con suelo con textura de cesped con margaritas, se observa una espada seleccionada con un box collider que la recubre.
Fig. 13: GameObject espada con un Box Collider asignado.

Luego probamos con un tipo de Collider esférico. Como se observa en la figura 14, el Collider es una esfera con el radio mínimo tal que la esfera contenga totalmente al GameObject espada.

escena en unity 3d con suelo con textura de cesped con margaritas, se observa una espada seleccionada con un sphere collider que la recubre. se observa un reloj de péndulo de oro.
Fig. 14: GameObject espada con un Sphere Collider asignado.

Ahora vamos a agregarle un Mesh Collider, este tipo de Collider utilizará la geometría del objeto. En la figura 15 se observan sus propiedades en el inspector.

visualizacion del inspector de un gameobject en unity3d
Fig. 15: Se ha agregado un componente Mesh Collider al GameObject espada.

Desactivamos el Mesh Renderer para observar el Collider y lo que vemos es que tiene la forma exacta de la espada, el Collider coincide con el mallado geométrico de triángulos.

visualización de un mesh collider aplicado a un gameobject espada. mesh renderer desactivado.
Fig. 16: Al apagar el componente Mesh Renderer del GameObject espada, podemos visualizar el Mesh Collider.

Por supuesto esto conlleva mayor complejidad en los cálculos de interacciones con este tipo de Collider, entonces tenemos que decidir si es necesario usarlo, o con un Box Collider nos es suficiente. Todo dependerá del propósito.

se observa la geometría de un collider tipo mesh collider en unity 3d.
Fig. 17: Se observa que el Mesh Collider tiene una geometría compleja, lo que se traduce en mayor tiempo de cómputos.

A continuación vamos a seleccionar el GameObject del reloj en la jerarquía y aplicarle un Mesh Collider pero esta vez haremos clic en la casilla “Convex” que se observa en las propiedades del Collider en la figura 18.

visualización del inspector de un gameobject en unity 3d.
Fig. 18: Se ha añadido un Mesh Collider al GameObject Reloj y se marcó la casilla Convex.

En la figura 19 observamos que ahora el tipo de Collider respeta parcialmente la geometría del objeto. Este tipo de Collider también conlleva mayor cantidad de cálculos, pero no tanto como sería en el caso anterior, es como si tuviésemos un modelo low poly del GameObject.

Además tiene otras ventajas como poder utilizarlo en modo Trigger.

reloj de péndulo de oro recubiero por un mesh collider convexo en unity3d. suelo de cesped con margaritas.
Fig. 19: Se visualiza el Mesh Collider en modo convexo.

Para entender cómo se utilizan los Colliders en modo Trigger te dejo los siguientes dos artículos que forman parte de la Serie Fundamental de Unity.

Método OnTriggerStay para Colliders en modo Trigger

Métodos OnTriggerEnter y OnTriggerExit para Colliders en modo Trigger

Por ahora vimos tres tipos de Colliders: Box Collider, Sphere Collider y Mesh Collider, pudiendo este último ser utilizado en modo Convexo, lo que simplifica la geometría del Collider.

cuatro tipos de colliders, fondo negro.
Fig. 20: Resumen de tipos de Colliders.

Comportamiento físico de los Colliders.

Los Colliders se comportan como barreras que no pueden atravesarse entre si. Es decir si nuestro personaje tiene un Collider e intenta atravesar un GameObject que tiene asignado un Collider (como podría ser el cubo o un reloj), no podrá hacerlo. A menos que este Collider esté en modo Trigger.

En la figura 21 se observa que el personaje está parado sobre el reloj, el Collider esférico evita que caiga.

modo juego de un proyecto en unity3d
Fig. 21: El jugador se encuentra parado sobre el reloj. El Mesh Collider que tiene asignado evita que el jugador caiga y lo atraviese.

Ahora vamos a situar la esfera suspendida en el aire sobre el cubo (este último fue escalado).

se observa una esfera blanca suspendida en el aire sobre un cubo blanco, cesped con margaritas. atardecer nublado.
Fig. 22: Se sitúa la esfera suspendida sobre el cubo.

Con la esfera seleccionada hacemos clic en Add Component y dentro de la categoría Physics seleccionamos el componente RigidBody.

visualización del inspector de un gameobject en unity 3d. menu add component desplegado, componente rigidbody seleccionada.
Fig. 23: Se añade un componente RigidBody a la esfera.

En la figura 24 se observan los parámetros del componente RigidBody, podemos asignar una masa, activar o desactivar la gravedad y modificar otros parámetros relacionados a la física de un objeto.

visualización de la componente rigidbody de un gameobject en unity 3d.
Fig. 24: Visualización de los parámetros de la componente RigidBody en el inspector.

Al entrar en el modo juego vemos que la esfera cae como por efecto de la gravedad y colisiona con la esquina del cubo (en realidad la colisión se produce con el Collider).

El componente RigidBody le otorga un comportamiento físico a la esfera.

modo juego de un proyecto en unity3d. esfera cae por gravedad sobre cubo.
Fig. 25: La pelota ha caído por efecto del comportamiento gravitatorio que otorga el componente RigidBody.

Agregar Colliders a las piezas del laberinto

Vamos a ir colocando uno por uno todos los prefabricados creados en el video anterior y configurando sus Colliders para que el jugador no pueda atravesar las paredes.

visualización del programa unity, proyecto de juego de laberinto.
Fig. 26: Abrimos la carpeta donde se encuentran los prefabricados que se hicieron en el video anterior.

Primero la pieza del callejón cerrado. Tomamos el Prefab de la carpeta del proyecto y lo arrastramos a la escena o a la jerarquía. Luego en el inspector hacemos clic en el botón Add Component y elegimos el componente Box Collider.

pieza de laberinto colocada en la escena de un proyecto en unity 3d. juego de laberinto.
Fig. 27: Colocamos en la escena la pieza callejón cerrado o “Dead End”.

Vemos en la figura 28 que el Collider cubre totalmente el GameObject, lo cual no nos permitirá caminar en su interior.

pieza con box collider de laberinto colocada en la escena de un proyecto en unity 3d. juego de laberinto..
Fig. 28: Se ha asignado un Box Collider a la pieza.

La figura 29 muestra que en el modo juego el personaje solo puede avanzar hasta la frontera del Box Collider. Este tipo de Collider no es apropiado para esta pieza.

pieza de laberinto colocada en la escena de un proyecto en unity 3d. juego de laberinto. modo juego, el personaje no puede atravesar el collider.
Fig. 29: El jugador no puede ingresar al espacio entre las paredes debido a que es obstaculizado por el Box Collider.

Tenemos una alternativa, si hacemos clic en el botón “Edit Collider” del Box Collider (figura 30), podremos modificar la posición de sus caras.

visualización de la componente box collider de un gameobject, se ha apretado el botón edit collider.
Fig. 30: Utilizando el botón Edit Collider podremos editar las dimensiones del Collider.

De esta forma podremos hacer que el Box Collider encierre una parte del objeto.

pieza con box collider de laberinto colocada en la escena de un proyecto en unity 3d. se cambia las dimensiones del box collider. juego de laberinto.
Fig. 31: Se mueve una de las caras del Collider para que coincida con una de las paredes.

Luego añadiendo más Colliders y repitiendo el proceso anterior para el resto de la geometría del objeto, lograríamos representar con suficiente precisión la frontera del objeto.

visualización del inspector de un gameobject en unity 3d. tres componentes box collider asignadas.
Fig. 32: Agregamos dos Box Colliders más y editamos.

En la figura 33 se observa que la superposición de los tres Box Colliders cubre toda la geometría de la pieza y permite que el jugador pueda circular por el interior.

pieza de laberinto con tres box colliders colocada en la escena de un proyecto en unity 3d. juego de laberinto.
Fig. 33: Utilizando tres Box Colliders se representa la frontea del GameObject.

Lo anterior nos sirve, pero vamos a eliminar todos los Box Colliders y agregar un Mesh Collider en su lugar, en este caso la geometría del muro e bastante simple.

visualización del mesh collider de una pieza de laberinto de un proyecto en unity3d. juego de laberinto.
Fig. 34: Con el componente Mesh Renderer desactivado se puede observar el componente Mesh Collider.

Algo muy importante cuando estamos tratando con Prefabs es aplicar los cambios que vamos haciendo, para eso utilizamos el botón Apply que se encuentra en la parte superior del inspector (si tenemos el Prefab seleccionado).

visualización del inspector de un gameobject en unity 3d.
Fig. 35: Es necesario aplicar los cambios que se hacen a un Prefab.

En la figura 36 se observa el modelo del portal con un componente Mesh Collider asignado.

visualización del mesh collider de un gameobject en un proyecto en unity3d. El gameobject es una puerta con muchos polígonos.
Fig. 36: Mesh Collider asignado a la puerta. Geometría compleja.

No se justifica utilizar un Mesh Collider para este modelo, teniendo en cuenta el uso que le vamos a dar, coloquemos mejor un Box Collider y apliquemos los cambios al Prefab.

escena de un proyecto en unity 3d. suelo de cesped con margarita, portal antiguo de piedras y madera. box collider asignado. juego de laberinto.
Fig. 37: Box Collider asignado a la puerta.

Lo mismo para el modelo del pedestal, con un Box Collider nos alcanza.

box collider asignado a un gameobject que es un pedestal de piedra con una espada incrustada. suelo de cesped con margarita. juego de laberinto en unity 3d.
Fig. 38: Box Collider asignado al pedestal con la espada.

Los relojes van a ser objetos colectables, es decir cuando el jugador pase por encima de ellos, estos desaparecerán y darán más tiempo de juego.

Teniendo en cuenta el uso que les vamos a dar, vamos a utilizar un Collider esférico, aumentando un poco el radio como se observa en la figura 39.

sphere collider asignado a un gameobject que es un reloj de péndulo de oro. suelo de cesped con margaritas. juego de laberinto en unity 3d.
Fig. 39: Se asigna un Sphere Collider en modo Trigger.

Luego vamos a activar la opción “Is Trigger” de la componente Sphere Collider. Esto hará que el Collider no obstaculice al jugador y permita detectar cuando este entra en la región esférica.

visualización de las propiades de un sphere collider en un proyecto en unity 3d. is trigger activado. juego de laberinto.
Fig. 40: Activando la casilla “Is Trigger” indicamos que el Collider actuará como Trigger.

Conclusión

En este artículo estudiamos distintos tipos de Colliders y para qué puede ser apropiado cada uno.

Todo depende del propósito que tengamos para el GameObject, por ejemplo en las piezas del laberinto utilizamos Mesh Collider porque necesitamos poder caminar por las regiones interiores del modelo. En cambio en los relojes utilizamo un Collider esférico porque es una pieza que el personaje podrá agarrar.

Los Colliders interactúan entre si y son muy importantes cuando entran en juego las componentes RigidBody, las cuales le dan a los GameObject comportamiento físico.