🎮 UnityDocs

Física 2D: Rigidbody2D y Collider2D

La física 2D de Unity (motor Box2D), separada de la 3D: Rigidbody2D, los tipos de Collider2D, Dynamic vs Kinematic vs Static, triggers, y por qué NO debes mezclar componentes 2D y 3D.

📄 ArtículoIntermedio✅ RevisadoUnity 6.0 LTSActualizado 2026-07-17
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 8 min · ⌨️ Práctica 20 min

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í.

Nunca mezcles componentes 2D y 3D

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 TypeQué haceEjemplo
DynamicLo mueve la física: gravedad, fuerzas, choquesEl jugador, cajas, enemigos físicos
KinematicNo le afecta la física; lo mueves tú con MovePositionPlataformas móviles, enemigos con movimiento controlado
StaticNo se mueve nunca (lo más barato)Suelo, paredes
C#
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);
    }
}
Renombrados de Unity 6 (también en 2D)

Como en 3D: velocitylinearVelocity, draglinearDamping, angularDragangularDamping. 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:

C#
// 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); }
}
Para que un trigger detecte, algo debe moverse con Rigidbody2D

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 de OnTriggerEnter2D (no se llama nunca).
  • Ningún objeto con Rigidbody2D en la pareja → los triggers no disparan.
  • Mover un transform.position con Rigidbody2D dinámico (atraviesa paredes): usa fuerzas/linearVelocity/MovePosition en FixedUpdate.
  • Personaje con Box Collider que se engancha en juntas: usa Capsule y colliders Composite en el suelo.

Ponte a prueba#

📝 Pon a prueba lo aprendido

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.

Fuentes y para profundizar