🎮 UnityDocs

Time, deltaTime y timeScale

Cómo mide el tiempo Unity y por qué casi todo movimiento se multiplica por Time.deltaTime. Las diferencias entre deltaTime, fixedDeltaTime y unscaledDeltaTime, y cómo pausar o ralentizar el juego con timeScale.

📄 ArtículoPrincipiante✅ RevisadoUnity 6.0 LTSActualizado 2026-07-17
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 7 min · ⌨️ Práctica 10 min

El problema: no todos los ordenadores van a los mismos FPS#

Update se llama una vez por fotograma, pero un PC potente hace 200 fotogramas por segundo y un móvil 30. Si mueves posicion += 5 por fotograma, el objeto irá 6 veces más rápido en el PC. Injusto e impredecible.

La solución: multiplicar por Time.deltaTime#

Time.deltaTime es cuántos segundos han pasado desde el fotograma anterior. Multiplicar por él convierte "por fotograma" en "por segundo":

C#
void Update()
{
    // ✅ 5 unidades por SEGUNDO, igual en cualquier equipo
    transform.position += Vector3.right * 5f * Time.deltaTime;
}

La regla: cualquier cosa que cambie con el tiempo en Update (movimiento, rotación, temporizadores) se multiplica por Time.deltaTime.

Regla de memoria

Si en tu cabeza dices "muévete 5 metros por segundo", el código es 5 * Time.deltaTime. Si dices "5 metros por fotograma", casi seguro es un bug de FPS.

deltaTime vs fixedDeltaTime#

En FixedUpdate (la física) el tiempo entre pasos es fijo (0,02 s por defecto). Ahí usa Time.fixedDeltaTime. Unity es listo: dentro de FixedUpdate, Time.deltaTime ya devuelve fixedDeltaTime, así que en la práctica puedes usar Time.deltaTime en ambos y funciona.

PropiedadQué mide
Time.deltaTimeSegundos desde el último fotograma (o el paso fijo, si estás en FixedUpdate)
Time.fixedDeltaTimeDuración del paso de física (fijo, configurable)
Time.timeSegundos desde que arrancó el juego
Time.unscaledDeltaTimeComo deltaTime, pero ignora timeScale

Pausar y ralentizar con timeScale#

Time.timeScale es un multiplicador global de la velocidad del tiempo. 1 = normal, 0 = congelado, 0.5 = cámara lenta.

C#
public void Pausar()   => Time.timeScale = 0f;   // congela física, animaciones y deltaTime
public void Reanudar() => Time.timeScale = 1f;
public void CamaraLenta() => Time.timeScale = 0.3f;

Es la base de un menú de pausa.

Con timeScale = 0, deltaTime también es 0

Al pausar con timeScale = 0, Time.deltaTime vale 0 y las corrutinas con WaitForSeconds se congelan. Para animar el propio menú de pausa o un contador que debe seguir con el juego parado, usa Time.unscaledDeltaTime y WaitForSecondsRealtime, que ignoran el timeScale.

Un temporizador correcto#

C#
[SerializeField] private float duracion = 3f;
private float restante;

void OnEnable() => restante = duracion;

void Update()
{
    restante -= Time.deltaTime;          // baja en segundos reales
    if (restante <= 0f) Explotar();
}

Errores frecuentes#

  • Mover o rotar en Update sin Time.deltaTime (velocidad dependiente de los FPS).
  • Multiplicar por deltaTime algo que no es por tiempo (p. ej. un salto instantáneo).
  • Olvidar poner timeScale = 1 al salir de la pausa (el juego se queda congelado).
  • Usar WaitForSeconds en el menú de pausa con timeScale = 0 (no avanza; usa Realtime).

Ponte a prueba#

📝 Pon a prueba lo aprendido

Resumen#

Unity mide el tiempo entre fotogramas con Time.deltaTime: multiplícalo por todo lo que cambie con el tiempo en Update para ser independiente de los FPS. En física usa el paso fijo (fixedDeltaTime). Con Time.timeScale pausas (0) o ralentizas (0.3) el juego entero; y cuando algo debe seguir con el juego pausado (menús, contadores reales), usa unscaledDeltaTime.

Fuentes y para profundizar