contacto[arroba]digitallearning.es

Colliders: detección de colisiones en videojuego Unity 3D

Post Series: Conociendo Unity3D (VII)

Seguimos viendo algunos elementos de Unity 3D que utilizaremos en el desarrollo del videojuego ejemplo que publicaremos más adelante. En esta ocasión trataremos la detección de colisiones, describiendo los principales componentes que intervienen, sus propiedades, así como dos métodos que permiten establecer el comportamiento cuando se producen dichas colisiones

Una de las tareas más comunes cuando creamos un videojuego es detectar las colisiones que se producen entre los diferentes elementos que intervienen en él, que proporcionan gran parte de la lógica de interacción del jugador con el entorno que le rodea en la escena. Visualmente se puede describir como el momento en el cual dos objetos se superponen, ocupando cada uno parte del área del otro objeto con el que colisionan.

Vemos pues una serie de conceptos relacionados con los componentes que intervienen para la detección de una colisión entre dos objetos

Colliders (Colisionadores)

Son áreas que envuelven al GameObject, utilizadas para detectar las colisiones entre diferentes objetos del juego. Un collider está formado, por un lado, de una determinada forma, que se recomienda sea lo más ajustada a la forma del objeto, y por otro lado, de un determinado material físico, que proporcionen características de rebote o fricción. Por defecto en Unity podemos encontrar materiales físicos a través de la ruta: Standard Assets > Physic Materials > Bouncy, Ice, Metal, Rubber y Wood.

A continuación, se describirán los distintos tipos de colliders que se pueden implementar:

Box Collider

Colisionador de caja que define un área con forma de cubo alrededor del objeto.

Este componente podrá añadirse a un GameObject a través de la ruta Add Component > Physics > Box Collider de la ventana inspector del objeto.

Scene:
Box xollider

 

Inspector:
Inspector box collider

 

Propiedades:

Propiedad Función
Is Trigger Si esta opción está activa, permite desencadenar eventos, además de ser ignorado por el motor de físicas.
Material Hace referencia al material físico utilizado para su interacción con el resto de colliders.
Center Posición del Collider en el espacio local del objeto.
Size Tamaño del Collider en las direcciones X, Y, Z.

Sphere Collider

Colisionador de esfera que define un área con forma de esfera alrededor del objeto.

Este componente podrá añadirse a un GameObject a través de la ruta Add Component > Physics > Sphere Collider de la ventana inspector del objeto.

Scene:
Sphere collider

 

Inspector:
Inspector sphere collider
 

Propiedades:

Propiedad Función
Is Trigger Si esta opción está activa, permite desencadenar eventos, además de ser ignorado por el motor de físicas.
Material Hace referencia al material físico utilizado para su interacción con el resto de colliders.
Center Posición del Collider en el espacio local del objeto.
Radius Indica el tamaño del Collider.

Capsule Collider

Colisionador de cápsula que define un área con forma de cápsula o elipsoide alrededor del objeto.

Este componente podrá añadirse a un GameObject a través de la ruta Add Component > Physics > Capsule Collider de la ventana inspector del objeto.

Scene:Capsule collider

 

Inspector:Inspector capsule collider

 

Propiedades:

Propiedad Función
Is Trigger Si esta opción está activa, permite desencadenar eventos, además de ser ignorado por el motor de físicas.
Material Hace referencia al material físico utilizado para su interacción con el resto de colliders.
Center Posición del Collider en el espacio local del objeto.
Radius Establece la anchura del Collider.
Height Indica la altura del Collider.
Direction Permite definir la orientación del eje longitudinal, dentro del espacio local del objeto.

Mesh Collider

Colisionador de malla. El colisionador se acopla a la malla del objeto al que se le asigna. Es una forma de obtener colisiones de manera muy precisa, pero consume muchos recursos.

Este componente podrá añadirse a un GameObject a través de la ruta Add Component > Physics > Mesh Collider de la ventana inspector del objeto.

Scene:
meshcollider_img

Inspector:
Inspector Mesh Collider

Propiedades:

Propiedad Función
Is Trigger Si esta opción está activa, permite desencadenar eventos, además de ser ignorado por el motor de físicas.
Material Hace referencia al material físico utilizado para su interacción con el resto de colliders.
Mesh Referencia a la malla utilizada para la detección de colisiones.
Smooth Sphere Collisions Al activar esta opción, permite suavizar las colisiones con la malla referenciada.
Convex Si se activa esta opción, posibilita la detección de colisiones con otro Mesh Collider.

Rigidbody

Este componente permite añadir al GameObject algunas características que tendría un cuerpo en la realidad, como podrían ser masa, gravedad, fricción, etc. Es muy útil para hacer que objetos de la escena interaccionen entre sí. Es necesario establecer este componente cuando se desea detectar colisiones entre dos objetos (al menos uno de los dos debe contenerlo).

Este componente podrá añadirse a un GameObject a través de la ruta Add Component > Physics > Rigidbody de la ventana inspector del objeto.

Inspector:

Rigid body inspector

Propiedades:

Propiedad Función
Mass Indica la masa del objeto en unidades arbitrarias.
Drag Resistencia del objeto al aire. Al establecer su valor en 0, se indica que no existe resistencia.
Angular Drag A diferencia de la propiedad Drag, el valor indicando permite controlar la resistencia del objeto al aire con un determinado ángulo de rotación.
Use Gravity Al activar esta opción, el objeto se verá afectado por la gravedad.
Is Kinematic Si esta opción se encuentra activada, el objeto no se verá sometido por el motor de físicas, y sólo podrá manipularse el componente Transform.
Interpolate Utilizado para controlar movimientos inesperados del componente Rigidbody asociado al objeto. Se pueden establecer los valores de:

  • None: no se aplica ninguna interpolación
  • Interpolate: suavizado del componente Transform con respecto al Transform del frame anterior
  • Extrapolate: suavizado del componente Transform con respecto al Transform del frame siguiente
Collision Detection Posibilita la detección de colisiones con objetos que se muevan a gran velocidad, impidiendo que traspasen dicho objeto. Se pueden establecer los valores de:

  • Discrete: se establece como valor por defecto, y permite la detección de colisiones con el resto de colliders definidos en la escena
  • Continuous: utilizado para la detección de colisiones con componentes de tipo MeshCollider estáticos sin Rigidbody
  • Continuous Dynamic: utilizado en objetos para la detección de colisiones fijados en Continuous y Continuous Dynamic. Muy útil para establecer en objetos que se muevan con rapidez

Se recomienda establecer la detección de colisiones fijado a Discrete.

Constraints Permite establecer restricciones de movimiento al componente Rigidbody definido. Se pueden establecer los valores de:

  • Freeze Position: detiene los movimientos en el mundo X, Y, Z del Rigidbody, de forma selectiva
  • Freeze Rotation: detiene la rotación en el mundo X, Y, Z del Rigidbody, de forma selectiva

Métodos para tratar colisiones

Vemos dos métodos con los que podemos establecer el comportamiento o las acciones que tendrán lugar en el juego cuando se produzca una colisión. Por ejemplo, cambio en las puntuaciones, decremento o incremento de vida, juego finalizado etc.

OnCollisionEnter()

Es quizá uno de los métodos predefinidos más útiles. A este método se le llama cada vez que el objeto que lleva este script colisiona con otro objeto de la escena:

OnTriggerEnter()

Un componente de tipo Collider puede ser marcado como Trigger (disparador). Esto significa que los objetos que colisionen con él no reaccionarán como si de una colisión real se tratase, sino que pasarán de largo, aunque se registrará que un objeto ha entrado en ese área definida por el colisionador.

Este método es el que detecta la intrusión en dicha área y es muy útil para crear sistemas de detección, como por ejemplo zonas que permitan al enemigo detectar la presencia del jugador: