Menu
CoddyTech

Mettere in pausa con timeScale

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 34 di 60.

Time.timeScale indica la velocità con cui scorre il tempo di gioco: 1 è la velocità normale e 0 lo ferma. A 0, Time.deltaTime è 0, quindi ogni movimento scritto come speed * Time.deltaTime resta fermo. FixedUpdate() non viene più chiamato, quindi i Rigidbody restano sospesi in aria, mentre WaitForSeconds e Invoke aspettano, perché conteggiano il tempo di gioco. Questo script attiva e disattiva la pausa tramite un pulsante il cui elenco On Click chiama TogglePause e mostra un pannello mentre il gioco è in pausa:

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

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

Non tutto si ferma. Update() e LateUpdate() continuano a essere chiamati a ogni fotogramma, con Time.deltaTime a 0; yield return null di una coroutine viene comunque eseguito al fotogramma successivo e l'interfaccia continua a ricevere i clic, ed è così che il pulsante può terminare la pausa. Anche i tasti vengono ancora letti: una rana che salta premendo Spazio in Update() rileverebbe la pressione durante la pausa e spiccherebbe un balzo al primo passo di fisica successivo alla pausa. Il suo script ignora i tasti mentre il tempo è fermo:

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

Time.timeScale riguarda l'intero gioco, non una singola scena: se carichi un'altra scena mentre vale 0, la nuova scena inizierà in pausa. Un pulsante del menu che riavvia o chiude un livello lo reimposta prima a 1.

challenge icon

Sfida

Medio

Aggiungi un menu di pausa al campo da tennis. La scena collega i pulsanti Pausa e Riprendi.

  1. In PauseMenu.cs, Pause() imposta Time.timeScale = 0f; e chiama panel.SetActive(true);.
  2. Resume() imposta Time.timeScale = 1f; e chiama panel.SetActive(false);.
  3. In BallMachine.cs, aggiungi if (Time.timeScale == 0f) return; sopra il controllo del tasto Spazio in Update().

Premi «Gioca», servi una palla e metti in pausa: rimane sospesa a mezz'aria. Poi premi «Verifica».

Provalo tu

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

    public void Pause()
    {
        // Ferma il tempo di gioco e mostra il pannello
    }

    public void Resume()
    {
        // Il tempo di gioco torna a scorrere alla velocità normale, con il pannello nascosto
    }
}

Tutte le lezioni di Creare veri giochi

Esercitati da solo: Playground Unity