Menu
CoddyTech

Tiempo sin escalar

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 35 de 56.

Un juego pausado o ralentizado sigue necesitando un reloj real para algunas cosas: un menú de pausa con animaciones, una cuenta regresiva antes de que se reanude la partida, un congelamiento que debe terminar por sí solo. Time.unscaledDeltaTime es el tiempo real desde el último fotograma, sea cual sea el valor de Time.timeScale, y Time.unscaledTime es el tiempo real desde que empezó el juego. Este menú de pausa hace girar su rueda de carga con tiempo real, así que la rueda gira mientras el juego está pausado:

void Update()
{
    wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime);   // media vuelta por segundo, esté en pausa o no
}

Las corrutinas tienen el mismo par. WaitForSeconds cuenta el tiempo del juego, así que con Time.timeScale = 0 nunca termina; WaitForSecondsRealtime cuenta segundos reales. Iniciada cuando se abre el menú, esta corrutina hace parpadear el título del menú cada medio segundo:

IEnumerator Blink()
{
    while (true)
    {
        title.SetActive(!title.activeSelf);
        yield return new WaitForSecondsRealtime(0.5f);
    }
}

Usa los valores escalados para la jugabilidad, que debería detenerse cuando se detiene el juego, y los no escalados para lo que debe ejecutarse mientras está pausado o ralentizado: los menús, sus animaciones y los temporizadores que terminan una pausa. Invoke no tiene una versión de tiempo real: siempre cuenta el tiempo del juego.

challenge icon

Desafío

Intermedio

Una pausa de impacto hace que un golpe fuerte se sienta contundente: todo el juego se congela por un momento al impactar. Las flechas mueven el dispositivo que suelta yunques y la barra espaciadora hace que caiga un yunque desde él (Dropper.cs, listo). Escribe Anvil.cs, que lleva cada yunque:

  • Cuando el yunque golpee algo, congela el juego: Time.timeScale 0.
  • freezeTime segundos reales después (0.3 en el Inspector), vuelve a establecerlo en 1.

Pulsa Play, deja caer unos cuantos yunques y, después, pulsa Check.

Pruébalo tú mismo

using System.Collections;
using UnityEngine;

public class Anvil : MonoBehaviour
{
    public float freezeTime = 0.3f;

    // Congela el juego durante freezeTime segundos reales cuando el yunque golpee algo
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Creación de juegos reales