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.
Sfida
MedioLa 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 usandoTime.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
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Creare veri giochi
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro4Scene e livelli
Caricare una scenaRiavviare il livelloLivello successivoMantenere i dati tra le sceneRiepilogo: selezione del livello10Progetto: Platform 3D
Il percorsoPiattaforme mobili2Pulsanti e schermate
Pulsanti e onClickLambdaCollegare nell'InspectorPannelli attivi e disattiviBarre della saluteRiepilogo: negozio degli upgrade5Salvare con PlayerPrefs
Salvare un numeroCaricare con un valore predefinitoPunteggio massimoSalvare le impostazioniRiepilogo: monete in banca8Controller del personaggio
CharacterController.MoveGravità manualeSaltoSpingere gli oggettiMuoviti dove guardiRiepilogo: doppio salto3Il gestore del gioco
Uno script gestisce il giocoIl SingletonStati di giocoSelezionare lo statoRiepilogo: gestore del round6Progetto: Corsa infinita
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di input