Menu
CoddyTech

Tiempo sin escalar

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 36 de 60.

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 el juego continúe, un congelamiento que debe terminar por sí solo. Time.unscaledDeltaTime es el tiempo real transcurrido desde el último fotograma, sea cual sea el valor de Time.timeScale, y Time.unscaledTime es el tiempo real transcurrido 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 seguir funcionando mientras está pausado o ralentizado: los menús, sus animaciones y los temporizadores que ponen fin a una pausa. Invoke no tiene una versión de tiempo real: siempre cuenta el tiempo del juego.

challenge icon

Desafío

Intermedio

Dale al yunque una pausa al impactar: todo el juego se congela por un momento cuando cae.

  1. En Anvil.cs, escribe IEnumerator HitStop(): Time.timeScale = 0f;, después yield return new WaitForSecondsRealtime(freezeTime);, y después vuelve a establecerlo en 1f.
  2. Escribe void OnCollisionEnter(Collision collision) que llame a StartCoroutine(HitStop());.

Pulsa «Jugar» y deja caer yunques con la barra espaciadora: cada aterrizaje congela el juego durante 0.3 segundos. Después, pulsa «Comprobar».

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
}

Todas las lecciones de Creación de juegos reales

Practica por tu cuenta: Playground de Unity