Movimiento independiente del frame rate en Unity

Resumen

El movimiento de un objeto en Unity no debe depender del frame rate. Si lo hace, tu juego se verá distinto en una computadora potente que en una vieja. La solución pasa por entender qué es el delta time y cómo aplicarlo en cada script que mueva, escale o transforme objetos a lo largo del tiempo.

¿Qué es el frame rate y por qué afecta tu juego?

Un videojuego se reproduce mostrando imagen tras imagen. El frame rate es la cantidad de frames (imágenes) que se renderizan por segundo, y el tiempo entre uno y otro es lo que ejecuta el método Update.

¿Qué son los FPS en Unity? Son los frames por segundo que tu computadora alcanza a renderizar. Puedes verlos activando el botón Stats en la pestaña Game, arriba a la derecha.

Para comprobar cómo el rendimiento afecta tu código, existe un truco: usar un script que simula lag. Ese script ejecuta instrucciones vacías, alrededor de 10⁵ por cada Update, para forzar que los frames caigan. Si subes mucho el valor, podrías llegar a congelar la computadora.

¿Cómo medir el frame rate real?

Arrastra el script de lag a una cápsula en escena, abre la pestaña Game y activa Stats. Sin lag, el juego puede correr a 150 FPS. Al activar el lag y subir la barra con cuidado, los frames bajan. El objetivo es llevarlo a 10 o 15 FPS para ver el efecto en el movimiento.

¿Qué pasa si mueves un objeto sin Time.deltaTime?

Imagina una esfera con un script llamado SinDeltaTime que usa transform.Translate con un valor fijo en Z, por ejemplo 0.05. Eso significa 5 centímetros por frame.

Mientras la computadora corre a 150 FPS, todo se ve fluido. Pero al activar el lag y bajar a 10 FPS, la esfera avanza muchísimo más lento. ¿Por qué? Porque el script dice: "cada frame muévete 5 cm", sin importar cuánto tiempo pase entre uno y otro.

  • Sin lag: 150 frames × 5 cm = avance rápido.
  • Con lag: 10 frames × 5 cm = avance mucho menor.
  • Resultado: el movimiento depende del hardware del jugador.

Ese comportamiento rompe la experiencia. Un jugador con mejor PC tendría ventaja sobre otro con una máquina más modesta.

¿Cómo se aplica Time.deltaTime correctamente?

La solución es declarar la velocidad en metros por segundo y multiplicarla por Time.deltaTime dentro del Update. Quedaría así:

csharp public float speed = 5f;

void Update() { transform.Translate(0, 0, speed * Time.deltaTime); }

Fíjate en la F al final del 5f. Cada vez que escribes un número con punto flotante en C#, debes añadir esa F para indicarle a Unity que es un float y no un double. Sin la F, el editor te marcará error.

¿Qué hace Time.deltaTime? Devuelve el tiempo en segundos que pasó entre el frame anterior y el actual. Al multiplicarlo por la velocidad, obtienes un movimiento constante en el tiempo real, no en frames.

Al probar dos objetos lado a lado, uno con Time.deltaTime y otro sin él, sin lag ambos avanzan a velocidad similar. Pero al activar el lag, el objeto con delta time sigue recorriendo 5 metros cada segundo, aunque salte visualmente, mientras que el otro se queda atrás.

¿Por qué no basta con memorizar la fórmula?

Podrías limitarte a multiplicar siempre por Time.deltaTime y olvidar la teoría. Pero entender la física detrás importa porque este principio no se usa solo para movimiento.

Si quieres que un globo crezca un 10% cada segundo, también necesitas multiplicar por Time.deltaTime. Si no, crecerá 10% por frame, lo que dispararía su tamaño en computadoras rápidas. Lo mismo aplica a rotaciones, cambios de color graduales, temporizadores y cualquier transformación dependiente del tiempo.

¿Cómo se traduce esto en tu flujo de trabajo en Unity?

Mover un objeto desde script implica hablar con el componente Transform. El método Translate desplaza el objeto en su espacio local, recibiendo valores en X, Y y Z. Combinarlo con una variable public float speed permite ajustarla desde el Inspector sin tocar código.

  • Declara la velocidad en metros por segundo, no por frame.
  • Multiplica el desplazamiento por Time.deltaTime siempre que esté dentro de Update.
  • Usa public para exponer la variable en el Inspector.
  • Recuerda la F en los float literales.
  • Activa Stats para monitorear FPS mientras pruebas.

Un truco práctico: si los objetos en escena se escapan de tu vista durante el play, presiona Shift + F para que la cámara los siga sin mover el mouse.

¿Qué experimento puedes hacer ahora?

En los recursos hay un archivo con un carro en movimiento y un objeto llamado lag. La consigna es darle play con el lag activado, esperar un segundo a que el juego se pause y observar hasta dónde llegó el carro. Después, desactiva el lag y repite. ¿Qué tan distintos son los puntos de llegada? ¿La diferencia crece si subes el lag? ¿Cómo podrías reducirla?

Déjalo en los comentarios. Ahora dominas el tiempo y el espacio en Unity: puedes mover objetos sin que el rendimiento del jugador rompa tu juego.