Menu
CoddyTech

Mettere in pausa con timeScale

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 33 di 56.

Time.timeScale indica la velocità del 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, e WaitForSeconds e Invoke aspettano, perché contano 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() vengono ancora chiamati a ogni frame, con Time.deltaTime a 0; yield return null di una coroutine riprende comunque al frame successivo e l'interfaccia continua a ricevere clic, permettendo al pulsante di terminare la pausa. Anche i tasti vengono ancora letti: una rana che salta premendo Space in Update() riceverebbe la pressione durante la pausa e farebbe un balzo al primo aggiornamento fisico successivo. Lo script della rana 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 scena: se carichi un'altra scena mentre vale 0, la nuova scena si avvia in pausa. Un pulsante del menu che riavvia o chiude un livello lo reimposta a 1 prima di farlo.

challenge icon

Sfida

Medio

La macchina spara-palle sul campo da tennis gira con le frecce sinistra e destra e lancia una palla premendo Spazio (BallMachine.cs). Aggiungi un menu di pausa al campo in PauseMenu.cs. Nella scena, il pulsante Pausa è collegato a Pause() e il pulsante Riprendi, che si trova sul PausePanel nascosto, è collegato a Resume(); nell’Inspector assegna il pannello a panel.

  • Pause() arresta il tempo di gioco e mostra il pannello.
  • Resume() riporta il tempo di gioco alla velocità normale e nasconde il pannello.
  • In BallMachine.cs, premendo Spazio non si deve lanciare una palla mentre il gioco è in pausa. La rotazione non richiede modifiche: è scritta usando Time.deltaTime.

Premi Play, lancia una palla e metti in pausa il gioco mentre è in 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 alla velocità normale, il pannello è nascosto
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Creare veri giochi