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.
Desafío
IntermedioLa 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 conTime.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
}
}
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
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro4Escenas y niveles
Cargar una escenaReiniciar el nivelSiguiente nivelConservar entre escenasRepaso: selección de nivel10Proyecto: plataformas 3D
El recorridoPlataformas móviles2Botones 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 infinito
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entrada