Mover al personaje siempre a velocidad instantánea puede sentirse brusco.
Podés suavizar cambios con aceleración.
velocidadActual = Mathf.MoveTowards(
velocidadActual,
velocidadObjetivo,
aceleracion * Time.deltaTime
);
movimientoActual = Vector3.MoveTowards(
movimientoActual,
movimientoObjetivo,
aceleracion * Time.deltaTime
);
movimientoActual = Vector3.Lerp(
movimientoActual,
movimientoObjetivo,
suavizado * Time.deltaTime
);
Lerp genera una aproximación suave, pero no representa una aceleración constante.
Vector3 objetivo =
direccion * velocidadMaxima;
movimientoActual = Vector3.MoveTowards(
movimientoActual,
objetivo,
aceleracion * Time.deltaTime
);
Podés tener:
[SerializeField]
private float aceleracion = 20f;
[SerializeField]
private float desaceleracion = 30f;
y elegir uno según haya input.