🎮 UnityDocs

Rigidbody: física de movimiento

El componente que somete un objeto al motor de física. Cómo moverlo con fuerzas y velocidades, los ForceMode, isKinematic vs dinámico, interpolación y los cambios de nombre en Unity 6.

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

Qué es#

Añadir un Rigidbody a un objeto lo pone bajo el control del motor de física (PhysX en 3D). A partir de ese momento, el objeto cae con la gravedad, choca, rebota y responde a fuerzas. Dejas de moverlo con transform.position y pasas a empujarlo con física.

Con Rigidbody, mueve con física, no con el Transform

Cambiar transform.position en un objeto con Rigidbody lo teletransporta y rompe las colisiones (atraviesa paredes). Usa fuerzas, linearVelocity o MovePosition, y hazlo en FixedUpdate. Ver Update vs FixedUpdate.

Mover con fuerzas#

C#
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class Nave : MonoBehaviour
{
    [SerializeField] private float empuje = 10f;
    private Rigidbody rb;

    void Awake() => rb = GetComponent<Rigidbody>();

    void FixedUpdate()
    {
        // Fuerza continua (como un motor)
        rb.AddForce(transform.forward * empuje);

        if (Input.GetKey(KeyCode.Space))
            // Impulso puntual (un salto, un golpe)
            rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);
    }
}

Los ForceMode#

ForceModeEfectoTiene en cuenta la masaEjemplo
ForceFuerza continuaMotor, viento
ImpulseGolpe instantáneoSalto, explosión
AccelerationContinua, ignora masaNoGravedad propia
VelocityChangeInstantánea, ignora masaNoDash inmediato

Mover por velocidad o posición#

C#
// Fijar la velocidad directamente (control preciso)
rb.linearVelocity = new Vector3(5f, rb.linearVelocity.y, 0f);

// Mover a una posición respetando colisiones (en FixedUpdate)
rb.MovePosition(rb.position + direccion * velocidad * Time.fixedDeltaTime);
Cambios de nombre en Unity 6

En Unity 6 varias propiedades del Rigidbody se renombraron: velocitylinearVelocity, draglinearDamping, angularDragangularDamping. Los nombres antiguos siguen funcionando pero aparecen como obsoletos. En tutoriales viejos verás rb.velocity.

Dinámico, cinemático y gravedad#

  • Dinámico (por defecto): lo mueve la física.
  • isKinematic = true: ignora fuerzas y gravedad; lo mueves tú (con MovePosition). Útil para plataformas móviles o cuando controlas el movimiento a mano pero quieres que empuje a otros.
  • useGravity: activa o desactiva la gravedad para ese objeto.
C#
rb.isKinematic = true;   // deja de obedecer a la física
rb.useGravity = false;   // ignora la gravedad

Interpolación y detección de colisiones#

Dos ajustes del Inspector que importan mucho:

  • Interpolation: la física va a 50 pasos/segundo, pero el render puede ir a 144 FPS, lo que se ve a tirones. Pon Interpolate en el Rigidbody del jugador/cámara para suavizar el movimiento visual.
  • Collision Detection: por defecto Discrete. Si un objeto rápido atraviesa paredes (tunneling), cámbialo a Continuous.
El jugador siempre con Interpolate

Si notas que el personaje se mueve "a saltitos" aunque los FPS sean altos, casi seguro es que le falta Interpolation. Actívalo en su Rigidbody.

Rendimiento#

Menos Rigidbodies dinámicos, mejor

Cada Rigidbody dinámico cuesta simulación. Para objetos que nunca se mueven (paredes, suelo) no pongas Rigidbody: un Collider sin Rigidbody ya es "estático" y es lo más barato. Poner Rigidbodies a todo, o mover colliders estáticos, obliga al motor a recalcular y baja el rendimiento.

Errores frecuentes#

  • Mover transform.position de un objeto con Rigidbody (rompe colisiones).
  • Aplicar fuerzas en Update en vez de FixedUpdate.
  • Mover un collider estático (sin Rigidbody) cada frame: es carísimo, añade un Rigidbody kinematic si debe moverse.
  • Olvidar Interpolation y ver el movimiento a tirones.
  • Usar rb.velocity (obsoleto en Unity 6) en vez de rb.linearVelocity.

Ponte a prueba#

📝 Pon a prueba lo aprendido

Resumen#

El Rigidbody entrega el objeto al motor de física: muévelo con AddForce (según el ForceMode), linearVelocity o MovePosition, siempre en FixedUpdate, y nunca tocando el Transform. Usa isKinematic para control manual, activa Interpolation en el jugador y Continuous si algo rápido atraviesa paredes. En Unity 6 recuerda linearVelocity y linearDamping.

Fuentes y para profundizar