Cuando desarrollamos un juego en Unity, una de las decisiones más importantes al implementar la mecánica de movimiento de los personajes es elegir entre Rigidbody y CharacterController. Ambas opciones tienen sus ventajas y desventajas, por lo que es fundamental entender cómo funcionan y cuándo utilizarlas.
En este artículo, te explicaré en detalle las diferencias entre estas dos opciones y en qué situaciones es mejor utilizar una u otra. 🚀
El Rigidbody es un componente de Unity que permite que un objeto sea afectado por la física del motor. Al agregar un Rigidbody a un GameObject, este podrá reaccionar a fuerzas, colisiones y la gravedad de manera realista.
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed = 5f;
public Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical) * speed;
rb.AddForce(movement, ForceMode.Force);
}
}
👉 Nota: En este código, usamos AddForce()
para aplicar una fuerza al Rigidbody, lo que hace que el movimiento sea más realista y afectado por la física.
El CharacterController es un componente especial que proporciona un sistema de colisión optimizado para personajes sin depender directamente de la física de Unity. Se utiliza principalmente para juegos donde el control preciso del personaje es más importante que la simulación física.
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed = 5f;
public float gravity = 9.8f;
private Vector3 moveDirection;
private CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
if (controller.isGrounded)
{
moveDirection = new Vector3(moveHorizontal, 0, moveVertical);
moveDirection *= speed;
}
// Aplicamos gravedad manualmente
moveDirection.y -= gravity * Time.deltaTime;
// Movemos el personaje
controller.Move(moveDirection * Time.deltaTime);
}
}
👉 Nota: Aquí usamos controller.Move()
para mover el personaje de forma directa, lo que permite un control preciso sin la interferencia de la física.
Característica | Rigidbody | CharacterController |
---|---|---|
Usa la física de Unity | ✅ Sí | ❌ No |
Responde a la gravedad automáticamente | ✅ Sí | ❌ No (se debe programar) |
Movimiento preciso | ❌ No (depende de la física) | ✅ Sí |
Reacciona a colisiones realistas | ✅ Sí | ❌ No (solo detecta colisiones) |
Ideal para FPS y plataformas | ❌ No | ✅ Sí |
Ideal para objetos físicos (vehículos, cajas) | ✅ Sí | ❌ No |
📌 En resumen:
✔️ Quieres que el personaje interactúe con la física del juego.
✔️ Necesitas que el personaje empuje o sea empujado por otros objetos.
✔️ El personaje puede ser afectado por fuerzas externas como explosiones.
✔️ Estás desarrollando un juego en tercera persona o un FPS con controles precisos.
✔️ No quieres que la inercia o la fricción afecten el movimiento del personaje.
✔️ Buscas un control suave y sin deslizamientos en plataformas.
Tanto Rigidbody como CharacterController son herramientas útiles en Unity, pero cada una tiene un propósito diferente. Si tu juego necesita interacción con la física, un Rigidbody es la mejor opción. Por otro lado, si buscas un movimiento más preciso y fluido, el CharacterController es la elección correcta.
Espero que esta comparación te haya sido útil. ¡Ahora ya sabes cuál usar en tu próximo proyecto en Unity! 🎮🚀
Jorge García
Fullstack developer