Un motor de física aparte#
Unity tiene dos motores de física independientes: 3D (PhysX, ver Rigidbody) y 2D (Box2D). Cada uno con sus componentes. Los conceptos son casi idénticos, pero no se hablan entre sí.
Un BoxCollider (3D) y un BoxCollider2D no colisionan entre sí. Un Rigidbody (3D) no interactúa con un Collider2D. En un juego 2D usa solo los componentes con el sufijo 2D. Mezclarlos es la causa nº1 de "no detecta la colisión" en 2D.
Rigidbody2D#
Somete al sprite a la física 2D. Su ajuste más importante es Body Type:
| Body Type | Qué hace | Ejemplo |
|---|---|---|
| Dynamic | Lo mueve la física: gravedad, fuerzas, choques | El jugador, cajas, enemigos físicos |
| Kinematic | No le afecta la física; lo mueves tú con MovePosition | Plataformas móviles, enemigos con movimiento controlado |
| Static | No se mueve nunca (lo más barato) | Suelo, paredes |
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
public class Caja : MonoBehaviour
{
private Rigidbody2D rb;
void Awake() => rb = GetComponent<Rigidbody2D>();
void FixedUpdate()
{
// En Unity 6: linearVelocity (antes 'velocity'), igual que en 3D
rb.AddForce(Vector2.right * 3f);
}
}Como en 3D: velocity → linearVelocity, drag → linearDamping, angularDrag → angularDamping. Congela la rotación con Constraints → Freeze Rotation Z para que el personaje no se tumbe al chocar.
Los Collider2D#
Definen la forma para colisionar. Los habituales:
- Box Collider 2D — cajas (plataformas, cofres).
- Circle Collider 2D — círculos (monedas, bombas).
- Capsule Collider 2D — personajes (no se engancha en esquinas).
- Polygon Collider 2D — forma libre ajustada al sprite.
- Composite Collider 2D — fusiona varios (ideal con Tilemap).
Colisión vs Trigger (en 2D)#
Igual que en 3D, pero con los métodos acabados en 2D:
// Choque físico (se frenan)
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.CompareTag("Enemigo")) RecibirDano();
}
// Trigger (Is Trigger activado): se atraviesan, solo avisa
void OnTriggerEnter2D(Collider2D otro)
{
if (otro.CompareTag("Moneda")) { Recoger(); Destroy(otro.gameObject); }
}Al menos uno de los dos objetos que se solapan necesita un Rigidbody2D (Dynamic o Kinematic) para que Unity dispare OnTrigger2D/OnCollision2D. Dos colliders estáticos sin Rigidbody no notifican nada.
Effectors: física 2D "de plataformas"#
Los Effector2D dan comportamientos típicos de plataformas sin código: Platform Effector 2D (plataformas que se atraviesan desde abajo y pisas desde arriba), Area Effector (zonas de viento/corrientes), Surface Effector (cintas transportadoras). Se añaden junto a un collider marcado como Used by Effector.
Errores frecuentes#
- Mezclar componentes 2D y 3D (no colisionan): usa siempre los
2D. - Usar
OnTriggerEnter(3D) en un juego 2D en vez deOnTriggerEnter2D(no se llama nunca). - Ningún objeto con Rigidbody2D en la pareja → los triggers no disparan.
- Mover un
transform.positioncon Rigidbody2D dinámico (atraviesa paredes): usa fuerzas/linearVelocity/MovePositionenFixedUpdate. - Personaje con Box Collider que se engancha en juntas: usa Capsule y colliders Composite en el suelo.
Ponte a prueba#
Resumen#
La física 2D usa Box2D, un motor aparte del 3D: emplea solo componentes con sufijo 2D y nunca los mezcles con los 3D. Rigidbody2D con su Body Type (Dynamic/Kinematic/Static), los Collider2D por forma, y OnCollisionEnter2D/OnTriggerEnter2D para reaccionar (recuerda que algo debe tener Rigidbody2D). Los Effector2D dan plataformas y corrientes sin código. Muévete siempre con física en FixedUpdate, no tocando el Transform.