Menu
CoddyTech

Pausar con timeScale

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

Time.timeScale indica la velocidad a la que transcurre el tiempo del juego: 1 es la velocidad normal y 0 lo detiene. En 0, Time.deltaTime es 0, así que cualquier movimiento escrito como speed * Time.deltaTime se queda quieto. FixedUpdate() deja de ejecutarse, por lo que los Rigidbody quedan suspendidos en el aire, y WaitForSeconds e Invoke esperan, ya que cuentan el tiempo del juego. Este script activa y desactiva 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; un 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 termine la pausa. Las teclas también se siguen leyendo: una rana que salta al pulsar Space en Update() recibiría la pulsación durante la pausa y saltaría en el primer paso de la física después de que termine. Su script omite 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 a una escena: carga otra escena mientras está en 0 y la nueva escena comenzará en pausa. Un botón del menú que reinicia o sale de un nivel primero lo restablece a 1.

challenge icon

Desafío

Intermedio

La máquina de pelotas de la cancha de tenis gira con las flechas izquierda y derecha y lanza una pelota al pulsar Space (BallMachine.cs). Añade un menú de pausa a la cancha en PauseMenu.cs. La escena conecta el botón Pause con Pause() y el botón Resume, que está en el PausePanel oculto, con Resume(); en el Inspector, asigna el panel a panel.

  • Pause() detiene el tiempo del juego y muestra el panel.
  • Resume() restablece la velocidad normal del tiempo del juego y oculta el panel.
  • En BallMachine.cs, Space no debe lanzar pelotas mientras el juego está en pausa. No es necesario cambiar el giro: está escrito con Time.deltaTime.

Pulsa Play, lanza una pelota y pon el juego en pausa mientras está en el aire; después, pulsa Check.

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
    }
}
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