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.
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#
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#
| ForceMode | Efecto | Tiene en cuenta la masa | Ejemplo |
|---|---|---|---|
Force | Fuerza continua | Sí | Motor, viento |
Impulse | Golpe instantáneo | Sí | Salto, explosión |
Acceleration | Continua, ignora masa | No | Gravedad propia |
VelocityChange | Instantánea, ignora masa | No | Dash inmediato |
Mover por velocidad o posición#
// 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);En Unity 6 varias propiedades del Rigidbody se renombraron: velocity → linearVelocity, drag → linearDamping, angularDrag → angularDamping. 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ú (conMovePosition). Ú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.
rb.isKinematic = true; // deja de obedecer a la física
rb.useGravity = false; // ignora la gravedadInterpolació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.
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#
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.positionde un objeto con Rigidbody (rompe colisiones). - Aplicar fuerzas en
Updateen vez deFixedUpdate. - 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 derb.linearVelocity.
Ponte a prueba#
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.