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.
Desafío
IntermedioAñade un menú de pausa a la pista de tenis. La escena conecta los botones de pausa y reanudación.
- En
PauseMenu.cs,Pause()estableceTime.timeScale = 0f;y llama apanel.SetActive(true);. Resume()estableceTime.timeScale = 1f;y llama apanel.SetActive(false);.- En
BallMachine.cs, añadeif (Time.timeScale == 0f) return;antes de la comprobación de la barra espaciadora enUpdate().
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
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: Corredor sin fin
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entradaPractica por tu cuenta: Playground de Unity