Colisión vs trigger#
Hay dos formas de que dos objetos interactúen físicamente:
- Colisión: chocan de verdad. Se frenan, rebotan, se empujan. Una pared, el suelo, una caja.
- Trigger: uno atraviesa al otro y solo detectamos el paso, sin frenar a nadie. Una moneda, una zona de meta, un detector.
Un collider se convierte en trigger marcando la casilla Is Trigger en el Inspector.
Qué necesitas para que funcione#
Esta es la fuente número uno de "no me detecta nada":
Para que se disparen los eventos, ambos objetos necesitan un Collider, y al menos uno de los dos debe tener un Rigidbody. Si dos objetos con collider pero sin ningún Rigidbody se tocan, no ocurre nada.
Detectar colisiones por código#
using UnityEngine;
public class Jugador : MonoBehaviour
{
// COLISIÓN física (colliders sin Is Trigger)
void OnCollisionEnter(Collision col)
{
if (col.gameObject.CompareTag("Enemigo"))
Debug.Log("Me ha golpeado un enemigo");
// Punto de contacto, útil para efectos
Vector3 punto = col.GetContact(0).point;
}
// TRIGGER (uno de los colliders con Is Trigger)
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Moneda"))
{
Recoger();
Destroy(other.gameObject);
}
}
}Cada evento tiene tres momentos:
| Colisión | Trigger | Cuándo |
|---|---|---|
OnCollisionEnter | OnTriggerEnter | Al empezar el contacto |
OnCollisionStay | OnTriggerStay | Cada frame mientras dura |
OnCollisionExit | OnTriggerExit | Al separarse |
En 2D los métodos llevan el sufijo 2D: OnCollisionEnter2D(Collision2D), OnTriggerEnter2D(Collider2D). Nunca mezcles componentes 2D con 3D: un Collider2D no interactúa con un Collider 3D.
Qué combinaciones funcionan#
| Objeto A | Objeto B | Resultado |
|---|---|---|
| Rigidbody dinámico + Collider | Collider estático | Colisión ✅ |
| Rigidbody dinámico + Collider | Rigidbody dinámico + Collider | Colisión ✅ |
| Rigidbody (cualquiera) + Collider trigger | Collider | Trigger ✅ |
| Collider (sin Rigidbody) | Collider (sin Rigidbody) | No pasa nada ❌ |
| Rigidbody kinematic + Collider | Collider estático (sin trigger) | No hay colisión física, pero sí trigger si uno es trigger |
Colliders: formas#
- Primitivos (Box, Sphere, Capsule): baratos y rápidos. Úsalos siempre que puedas.
- Mesh Collider: se ajusta a la malla exacta, pero es caro. Para que dos mesh colliders choquen, deben marcarse Convex.
Un personaje se representa mejor con un Capsule Collider que con un Mesh Collider de su modelo: más rápido y sin enganchones. Reserva los mesh colliders para escenarios estáticos.
Physics Material: rebote y fricción#
Un Physics Material (asignado al collider) define la fricción y el rebote. Un material con Bounciness alta hace una pelota saltarina; fricción baja, hielo resbaladizo.
Errores frecuentes#
- Que ninguno de los dos objetos tenga Rigidbody (no se dispara nada).
- Mezclar componentes 2D y 3D.
- Esperar
OnCollisionEntercuando el collider es trigger (usaríasOnTriggerEnter). - Mover un collider estático (sin Rigidbody) cada frame: rendimiento pésimo; ponle Rigidbody kinematic.
- Abusar de Mesh Colliders donde bastaría un Box o Capsule.
Ponte a prueba#
Resumen#
Colisión = chocan; trigger = atraviesan y se detecta el paso (marca Is Trigger). Para que salte cualquier evento, ambos necesitan Collider y al menos uno un Rigidbody. Usa OnCollisionEnter/OnTriggerEnter (con sufijo 2D en 2D), prefiere colliders primitivos y filtra con Tags y Layers.