En este tutorial veremos qué es Time.deltaTime en Unity y cómo utilizarlo.


La versión en video de este tutorial no está disponible actualmente en este idioma.


Transcripción del video

Hola a todos. En este tutorial veremos qué es Time.deltaTime en Unity y cómo utilizarlo.

Este tutorial, pensado para principiantes, es perfecto para quienes se están iniciando en scripting en C# dentro de Unity, ya que el tema es fundamental y merece comprenderse bien, porque lo encontrarán en muchos scripts y tutoriales.

El tutorial fue creado con Unity 2022, pero Time.deltaTime existe desde varias versiones del software y probablemente seguirá estando disponible en el futuro.

Time.deltaTime es una variable que representa el tiempo transcurrido, en segundos, entre el último frame y el frame actual, o si lo prefieren, el tiempo que tardó en completarse el frame anterior.

Se utiliza para hacer que los movimientos y las animaciones sean independientes del frame rate, normalmente multiplicando la velocidad de un objeto en unidades por segundo por Time.deltaTime en cada frame.

De esta forma, la velocidad por frame variará según el frame rate, garantizando la misma velocidad en dispositivos con diferentes niveles de rendimiento.

Veamos un ejemplo práctico de lo que acabamos de describir, con un caso muy sencillo: el movimiento de un objeto a lo largo de un eje a velocidad constante. Inserten un objeto en la escena, encuadrando la escena desde arriba con una vista Isometric.

Asigne al objeto un script en C#, llamándolo por ejemplo movement, y luego creen un Vector3 para indicar un desplazamiento de una unidad, que queremos recorrer en un segundo:

private Vector3 obVelocity = new Vector3(0.0f, 0.0f, 1.0f);

Sabemos que Update se llama en cada frame. Sin embargo, no sabemos cuántos frames por segundo ejecutará el juego, ya que esto varía según varios parámetros.

Si nuestro frame rate fuera constantemente de 50 frames por segundo, podríamos modificar obVelocity a (0.0f, 0.0f, 0.02f), moviendo 0.02 unidades en cada llamada a Update y, por lo tanto, en cada frame, obteniendo así un desplazamiento de una unidad por segundo.

Como no tenemos esa posibilidad, en Update escribiremos:

transform.position += (obVelocity * Time.deltaTime);

Guarden el script y regresen al Editor de Unity para observar el resultado: el objeto se mueve de forma lineal, manteniendo una velocidad de una unidad de la escena por segundo.

En conclusión, para mover un objeto a una determinada velocidad, expresada en unidades de la escena por segundo, establezcan esta velocidad en una variable y, dentro de la función Update, multiplíquenla por Time.deltaTime, como les mostré anteriormente.

Ahora veamos otro ejemplo.

En la escena que estoy utilizando ahora, a la Main Camera se le ha asignado un script de movimiento que detecta la pulsación de las teclas de dirección, usando Input.GetAxis para Horizontal y Vertical.

Los valores de Horizontal y Vertical van de -1 a 1 en ambos casos, por lo que si multiplicara directamente estos valores por Time.deltaTime en la función Update del script, obtendría un desplazamiento de una unidad en la escena por segundo, pero esta solución no permite ajustar la velocidad.

Para resolver este problema, lo más sencillo es definir una variable privada con el modificador Serialized, que pueda verse y modificarse en el Inspector al probar el juego en el Editor.

En el ejemplo que les muestro en el video, esta variable se llama speed y tiene inicialmente un valor de 12.

En la función Update, el movimiento se gestiona mediante controller.Move, ya que el personaje está asociado a un componente Character Controller que se mueve usando la función Move.

La función se llama con un parámetro bastante largo, dividido en dos partes.

En la primera parte, se calcula el desplazamiento a lo largo de los ejes X y Z en función de la entrada del usuario, almacenada en la variable move, que es un Vector3.

En la segunda parte, se calcula la fuerza de la gravedad cuando se realiza un salto.

Time.deltaTime se utiliza tanto en el cálculo del movimiento a lo largo de los ejes como en el movimiento vertical debido a la gravedad, pero ignoraremos la segunda parte, que requeriría una explicación más extensa, y nos centraremos en la primera.

El vector de movimiento move se multiplica por Time.deltaTime, como vimos con el cubo en el primer ejemplo, pero también se multiplica por la variable float speed.

Luego paso al Editor de Unity y ejecuto el juego para mostrarles cómo es posible cambiar la velocidad de movimiento del personaje modificando en tiempo real el valor del parámetro Speed en la pestaña del script.

De esta manera, es posible calibrar la velocidad al inicio del juego.

Dado que esta velocidad se multiplica por Time.deltaTime, sabemos que será la misma en distintos dispositivos, independientemente del frame rate de ejecución.

Como speed es una variable en el código, también será posible modificarla durante el juego en función de determinados eventos.

Por ejemplo, el jugador podría beber una poción que le permita moverse al doble de velocidad o, por el contrario, avanzar más lentamente de lo habitual.

El punto clave es que esta velocidad será coherente en distintos dispositivos, ya que es independiente del frame rate gracias a Time.deltaTime.

En conclusión, en este video hemos visto dos ejemplos sencillos de uso de Time.deltaTime.

Pronto publicaré un video sobre rotaciones usando Slerp, donde Time.deltaTime se empleará para lograr rotaciones a velocidad constante, independientemente del frame rate.

Eso es todo por este tutorial. Hasta pronto.

Este sitio web tiene como único propósito mostrar algunos de mis trabajos, sin ninguna intención promocional. Ten en cuenta que actualmente no estoy buscando - ni responderé a - solicitudes de trabajos personalizados, consultorías u otro tipo de colaboraciones profesionales.


POLÍTICA EXTENDIDA DE PRIVACIDAD Y UTILIZACIÓN DE COOKIES