Movimiento con deltaTime en Unity

Resumen

Mover un objeto en Unity de forma correcta significa respetar el tiempo del juego para que su desplazamiento se vea natural sin importar los frames por segundo. La fórmula clave es simple: velocidad multiplicada por deltaTime, lo que te da la distancia exacta que el objeto debe recorrer entre un frame y el siguiente.

¿Cómo se relaciona la física con el movimiento en Unity?

Todo parte de una fórmula básica de cinemática: la velocidad es igual a la distancia sobre el tiempo. Pero cuando programas un videojuego, lo que te interesa despejar es la distancia.

Por álgebra, la distancia equivale a velocidad por tiempo. Si un carro se mueve a 30 metros por segundo y pasan 2 segundos, recorrió 60 metros. Hasta ahí, intuitivo.

¿Por qué necesitas un vector direccional?

Una distancia sola no basta. Necesitas saber hacia dónde se mueve el objeto: norte, sur, arriba o abajo. Por eso multiplicas el resultado por un vector direccional.

Si el carro avanza hacia el sur, multiplicas la distancia por -Vector3.forward, porque el sur en Unity equivale a moverse hacia atrás respecto al eje Z. Ese vector convierte un número plano en un desplazamiento con dirección clara dentro del espacio 3D.

¿Qué es Vector3.forward en Unity? Es un vector direccional que representa el frente del objeto (eje Z positivo). Lo usas para indicar hacia dónde apunta el movimiento.

¿Cómo calculas la distancia entre frames con deltaTime?

Aquí está el corazón del asunto. Imagina un personaje que viaja a 10 metros por segundo. ¿Cuánta distancia recorrió entre el frame anterior y el actual?

El tiempo entre frames no es un dato que escribas a mano: lo entrega Unity a través de Time.deltaTime, que mide los segundos transcurridos desde el último frame. Como un juego puede correr hasta 200 frames por segundo, ese valor es minúsculo.

La operación queda así:

  • Multiplicas la velocidad por Time.deltaTime.
  • Obtienes una diferencial de movimiento, que es un vector pequeño.
  • Sumas ese vector a la posición actual del personaje.

Y listo, el objeto avanza una fracción exacta cada frame, manteniendo una velocidad constante en metros por segundo sin importar el rendimiento del equipo.

¿Cuál es la diferencia con el MRU clásico?

En el problema clásico de movimiento rectilíneo uniforme, la solución es un número. En Unity, la solución es un vector, porque mover un objeto exige dirección además de magnitud.

Si solo tienes un escalar, lo conviertes en vector multiplicándolo por una dirección:

  • Vector3.forward para avanzar hacia el frente.
  • Vector3.right para moverse a la derecha.
  • Vector3.up para subir.

¿Por qué multiplicar velocidad por deltaTime? Porque garantiza que el objeto recorra la misma distancia por segundo en cualquier computadora, sin importar cuántos frames por segundo procese el juego.

¿Cómo aplicas esta fórmula al mover un personaje?

La receta cabe en una línea mental: velocidad × deltaTime × dirección. Ese resultado lo sumas a la posición actual del objeto en cada frame.

Si tu personaje viaja a 10 metros por segundo hacia el frente, en cada ciclo de actualización Unity calcula un pedacito de distancia y lo añade a su transformación. Esos pedacitos, sumados cientos de veces por segundo, producen un movimiento fluido y consistente.

La próxima vez que necesites desplazar un objeto en tu juego, recuerda esta lógica antes de escribir código: primero entiende el vector, después la multiplicación con Time.deltaTime, y al final la suma a la posición. ¿Tú ya habías intentado mover objetos sin usar deltaTime? Cuéntame qué pasó en los comentarios.