Vamos a describir cómo configurar los ajustes antes de generar la versión del videojuego Unity que podrá ejecutarse…
Colliders: detección de colisiones en videojuego Unity 3D
2.
Colliders: detección de colisiones en videojuego Unity 3D
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.
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.
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.
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.
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:
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:
|
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:
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:
|
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:
1 2 3 4 5 6 7 8 9 |
void OnCollisionEnter(Collision collision) { GameObject objeto1 = GameObject.Find("objeto1"); if (collision.gameObject.name == "objeto2") { Debug.Log("objeto1 ha colisionado con objeto2"); } } |
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:
1 2 3 4 5 6 7 8 9 |
void OnTriggerEnter (Collider collider) { GameObject objeto1 = GameObject.Find("objeto1"); if (collider.gameObject.name == "objeto2") { Debug.Log("objeto1 ha entrado en área de objeto2"); } } |