Menu
CoddyTech

Pausar con timeScale

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

Time.timeScale indica la velocidad a la que transcurre el tiempo del juego: 1 es la velocidad normal y 0 lo detiene. Cuando es 0, Time.deltaTime es 0, así que todo movimiento escrito como speed * Time.deltaTime se queda inmóvil. FixedUpdate() deja de ejecutarse, por lo que los cuerpos rígidos quedan suspendidos en el aire, y WaitForSeconds e Invoke esperan, ya que cuentan el tiempo del juego. Este script alterna la pausa desde un botón cuya lista On Click llama a TogglePause y muestra un panel mientras el juego está en pausa:

public class PauseToggle : MonoBehaviour
{
    public GameObject pausePanel;
    bool paused;

    public void TogglePause()
    {
        paused = !paused;
        Time.timeScale = paused ? 0f : 1f;
        pausePanel.SetActive(paused);
    }
}

No todo se detiene. Update() y LateUpdate() siguen ejecutándose en cada fotograma, con Time.deltaTime en 0; el yield return null de una corrutina sigue reanudándose en el fotograma siguiente, y la interfaz sigue respondiendo a los clics, lo que permite que el botón ponga fin a la pausa. Las teclas también se siguen leyendo: una rana que salta al pulsar Espacio en Update() recibiría la pulsación durante la pausa y saltaría en el primer paso de física posterior. El script de la rana ignora las teclas mientras el tiempo está detenido:

void Update()
{
    if (Time.timeScale == 0f) return;   // en pausa: ignora las teclas
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
    }
}

Time.timeScale afecta a todo el juego, no solo a una escena: si cargas otra escena mientras su valor es 0, la nueva escena empieza en pausa. Un botón del menú que reinicie o cierre un nivel primero lo establece en 1.

challenge icon

Desafío

Intermedio

Añade un menú de pausa a la pista de tenis. La escena conecta los botones de pausa y reanudación.

  1. En PauseMenu.cs, Pause() establece Time.timeScale = 0f; y llama a panel.SetActive(true);.
  2. Resume() establece Time.timeScale = 1f; y llama a panel.SetActive(false);.
  3. En BallMachine.cs, añade if (Time.timeScale == 0f) return; antes de la comprobación de la barra espaciadora en Update().

Pulsa «Jugar», sirve una pelota y pausa: se queda suspendida en el aire. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

    public void Pause()
    {
        // Detén el tiempo del juego y muestra el panel
    }

    public void Resume()
    {
        // El tiempo del juego vuelve a transcurrir a velocidad normal y el panel queda oculto
    }
}

Todas las lecciones de Creación de juegos reales

Practica por tu cuenta: Playground de Unity