Tempo non scalato
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 35 di 56.
Un gioco in pausa o rallentato ha comunque bisogno di un orologio reale per alcune cose: un menu di pausa animato, un conto alla rovescia prima che il gioco riprenda, un congelamento 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, in pausa o no
}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 all'apertura del 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 gameplay, che dovrebbe fermarsi quando il gioco si ferma, e quelli non scalati per ciò che deve 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
MedioUn hit stop fa sembrare pesante un colpo pesante: l'intero gioco si blocca per un momento all'impatto. Le frecce muovono il dispositivo di rilascio e la barra spaziatrice fa cadere un'incudine da esso (Dropper.cs, già pronto). Scrivi Anvil.cs, che ogni incudine porta con sé:
- Quando l'incudine colpisce qualcosa, blocca il gioco:
Time.timeScale0. - Dopo
freezeTimesecondi reali (0.3 nell'Inspector), impostalo di nuovo su 1.
Premi Play, fai cadere alcune incudini, poi premi Check.
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
}
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