Tempo non scalato
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 36 di 60.
Anche un gioco in pausa o rallentato ha bisogno di un orologio reale per alcune cose: un menu di pausa con animazioni, un conto alla rovescia prima che il gioco riprenda, un blocco che deve terminare da solo. Time.unscaledDeltaTime è il tempo reale trascorso dall'ultimo fotogramma, qualunque sia il valore di Time.timeScale, e Time.unscaledTime è il tempo reale trascorso dall'avvio del gioco. Questo menu di pausa fa ruotare la rotellina di caricamento usando il tempo reale, così la rotellina gira mentre il gioco è in pausa:
void Update()
{
wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime); // mezzo giro al secondo, anche in pausa
}Le coroutine hanno la stessa coppia. WaitForSeconds conta il tempo di gioco, quindi con Time.timeScale = 0 non termina mai; WaitForSecondsRealtime conta i secondi reali. Avviata quando si apre il menu, questa coroutine fa lampeggiare il titolo del menu ogni mezzo secondo:
IEnumerator Blink()
{
while (true)
{
title.SetActive(!title.activeSelf);
yield return new WaitForSecondsRealtime(0.5f);
}
}Usa i valori scalati per il gioco, che dovrebbe fermarsi quando si ferma il gioco, e quelli non scalati per ciò che deve continuare a funzionare mentre è in pausa o rallentato: i menu, le relative animazioni e i timer che terminano una pausa. Invoke non ha una versione basata sul tempo reale: conta sempre il tempo di gioco.
Sfida
MedioFai fermare il gioco all'impatto dell'incudine: quando atterra, l'intero gioco si blocca per un momento.
- In
Anvil.cs, scriviIEnumerator HitStop():Time.timeScale = 0f;, poiyield return new WaitForSecondsRealtime(freezeTime);, quindi reimpostalo a1f. - Scrivi
void OnCollisionEnter(Collision collision)che chiamaStartCoroutine(HitStop());.
Premi «Gioca» e fai cadere le incudini con Spazio: ogni atterraggio blocca il gioco per 0.3 secondi. Poi premi «Verifica».
Provalo tu
using System.Collections;
using UnityEngine;
public class Anvil : MonoBehaviour
{
public float freezeTime = 0.3f;
// Blocca il gioco per freezeTime secondi reali quando l'incudine colpisce qualcosa
}
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