CharacterController permite mover personajes con colisiones sin depender completamente de la física de un Rigidbody.

Obtener referencia

private CharacterController controller;

void Awake()
{
    controller = GetComponent<CharacterController>();
}

Mover

Vector2 input = moveAction.action.ReadValue<Vector2>();

Vector3 direccion = new Vector3(
    input.x,
    0f,
    input.y
);

controller.Move(
    direccion * velocidad * Time.deltaTime
);

Importante

CharacterController.Move() no aplica gravedad automáticamente.

La gravedad debe programarse.


Grounded

if (controller.isGrounded)
{
    Debug.Log("En el suelo");
}

Ejemplo con gravedad

private float velocidadVertical;
[SerializeField]
private float gravedad = -9.81f;

void Update()
{
    if (controller.isGrounded && velocidadVertical < 0f)
    {
        velocidadVertical = -2f;
    }

    velocidadVertical += gravedad * Time.deltaTime;

    Vector3 movimiento = direccion * velocidad;
    movimiento.y = velocidadVertical;

    controller.Move(movimiento * Time.deltaTime);
}

Cuándo usarlo

Es muy usado para: