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.
Sfida
MedioAggiungi un menu di pausa al campo da tennis. La scena collega i pulsanti Pausa e Riprendi.
- In
PauseMenu.cs,Pause()impostaTime.timeScale = 0f;e chiamapanel.SetActive(true);. Resume()impostaTime.timeScale = 1f;e chiamapanel.SetActive(false);.- In
BallMachine.cs, aggiungiif (Time.timeScale == 0f) return;sopra il controllo del tasto Spazio inUpdate().
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
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro2Pulsanti 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: Runner infinito
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di inputEsercitati da solo: Playground Unity