Colliders y triggers en Unity

Resumen

Detectar cuándo dos objetos chocan o se aproximan es una de las bases del desarrollo de videojuegos en Unity. La forma correcta de hacerlo no es con distancias, sino con colliders y triggers, dos herramientas optimizadas que te permiten responder a interacciones físicas sin sacrificar rendimiento.

¿Por qué evitar el cálculo por distancia en Unity?

Usar distancias para detectar contactos parece intuitivo, pero esconde un problema técnico importante. La distancia se calcula con una raíz cuadrada, una operación cara que consume muchos recursos de la computadora.

Si la metes dentro de un update, que se ejecuta múltiples veces por segundo, y multiplicas eso por decenas de scripts en escena, tu juego empieza a sufrir. Imagínate 100 osos calculando distancia al jugador en cada frame: un desastre de rendimiento.

Los colliders, en cambio, están optimizados por Unity y se apoyan en la tarjeta de video mediante el sistema physics. Por eso siempre que puedas, prefiere colliders sobre cálculos manuales de distancia.

¿Qué es un collider en Unity? Es un componente que define la forma física de un objeto para que pueda detectar contactos con otros. Puede ser una caja, una esfera, una cápsula o un mesh.

¿Qué necesita un objeto para colisionar con otros?

Para que un objeto reaccione a su entorno necesita dos componentes mínimos: un collider y un rigidbody. Sin esa combinación, las físicas de Unity simplemente no se activan.

Hay un detalle clave: el collider debe ser convexo, no cóncavo. Los colliders cóncavos no pueden simularse con rigidbody. Si tu modelo tiene fisuras o huecos, marca la opción convex o sustitúyelo por un collider primitivo.

Los colliders primitivos como caja, esfera y cápsula son mucho más baratos de procesar que un mesh collider. Si tu bate puede aproximarse a una cápsula perfecta, úsala. Tu juego lo agradecerá.

¿Cuál es la diferencia entre collisions y triggers?

Ambos detectan contacto, pero se comportan distinto:

  • Collisions: son físicos. Los objetos chocan, rebotan y no pueden sobreponerse.
  • Triggers: detectan el contacto pero no impiden el paso. Los objetos pueden atravesarse.
  • Activación: los collisions disparan mensajes solo si hay rigidbody y collider configurados; los triggers requieren que al menos uno de los colliders esté marcado como is trigger.

El ejemplo del oso lo deja claro [02:30]. Si el área de agro fuera una colisión, el jugador chocaría contra una muralla invisible. Como trigger, el jugador atraviesa el campo y el oso recibe un aviso para reaccionar.

¿Cómo detectar contactos con OnCollisionEnter?

Unity expone mensajes especiales que se llaman automáticamente cuando hay contacto. Los principales para colisiones físicas son OnCollisionEnter, OnCollisionStay y OnCollisionExit.

Estos mensajes reciben un parámetro de tipo Collision, que representa la acción de colisionar. Desde ahí puedes acceder a propiedades como relativeVelocity, que te dice con qué velocidad llegó el impacto.

En el ejemplo del bate y la pelota [08:00], al imprimir c.relativeVelocity.magnitude con Debug.Log, la consola reportó un golpe a 17 metros por segundo. Ese dato te sirve para escalar daño, sonido o efectos visuales según la fuerza real del impacto.

Para mover el bate respetando la física, usamos Rigidbody.MovePosition y Rigidbody.MoveRotation dentro de un script auxiliar [06:00]. Mover el transform directamente no genera fuerza realista, pero mover el rigidbody sí.

¿Y cómo funcionan los mensajes de trigger?

Los triggers usan OnTriggerEnter, OnTriggerStay y OnTriggerExit. La diferencia importante es el parámetro: ya no recibes un Collision, recibes un Collider.

¿Cuál es la diferencia entre Collision y Collider? Una Collision es la acción de chocar e incluye datos del impacto como velocidad. Un Collider es el componente físico, el sustantivo. Por eso los triggers no exponen relativeVelocity.

En el ejemplo [10:30], al cambiar el collider de la pelota a is trigger, el bate empezó a atravesarla. OnCollisionEnter dejó de dispararse, pero OnTriggerEnter sí registró cada entrada. Imprimiendo el parámetro recibido, la consola identificó que el objeto invasor era el bate.

¿Cómo trabajar colisiones en física 2D?

Unity separa la física 2D y 3D en sistemas distintos. Si tu juego es 2D, los mensajes y parámetros llevan el sufijo 2D:

  • OnCollisionEnter2D recibe un Collision2D.
  • OnTriggerEnter2D recibe un Collider2D.
  • Los componentes también cambian: Rigidbody2D, BoxCollider2D, CircleCollider2D.

Mezclar componentes 2D con 3D no funciona. Si pones un BoxCollider sobre un objeto que usa Rigidbody2D, las colisiones nunca se disparan.

¿Qué puede salir mal al configurar colisiones y triggers?

Cuando dos objetos no reaccionan entre sí, casi siempre falta algo en la configuración. Los puntos más frecuentes:

  • Uno de los objetos no tiene collider o no tiene rigidbody.
  • El rigidbody está marcado como kinematic y ninguno de los dos tiene uno dinámico.
  • Para colisiones físicas, ninguno de los colliders debe estar marcado como is trigger.
  • Para triggers, al menos uno de los colliders debe estar marcado como is trigger.
  • El collider está mal posicionado o tiene una escala incorrecta respecto al modelo visual.

Unity ofrece tablas oficiales que muestran qué mensajes se disparan según la combinación de componentes. Tenerlas a mano te ahorra horas de depuración.

¿Has tenido problemas configurando colisiones en tus proyectos? Cuéntame en los comentarios qué combinación te dio más dolores de cabeza.