Mantenere i dati tra le scene
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 20 di 56.
Caricare una scena distrugge tutti gli oggetti della scena precedente, ma alcune cose devono durare per tutta la partita, come le monete che un giocatore porta da un livello all'altro. DontDestroyOnLoad(gameObject) sposta un oggetto fuori dalla sua scena e lo mette in una scena tutta sua, chiamata DontDestroyOnLoad nella Hierarchy durante Play, che i caricamenti non toccano mai. Funziona solo su un oggetto radice: su un oggetto figlio, Unity registra un avviso e non conserva nulla. Gli oggetti figli dell'oggetto conservato lo seguono, ma non gli oggetti a cui si limita a fare riferimento: dopo il caricamento, un campo che puntava a un oggetto della vecchia scena contiene un oggetto distrutto, che risulta uguale a null.
public class GameSession : MonoBehaviour
{
public static GameSession Instance;
public int coins;
void Awake()
{
if (Instance != null)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
}
}Questa GameSession si trova nella scena Menu. Durante Play si passa da Menu a Level1 e poi si torna a Menu, che ricrea tutti i suoi oggetti, inclusa una nuova GameSession, mentre quella conservata è ancora presente. Senza il controllo in Awake ce ne sarebbero due, e la nuova sovrascriverebbe Instance con 0 monete. Con il controllo, la nuova trova Instance già impostata, si distrugge e si ferma, mentre la sessione che è passata attraverso i livelli rimane.
return è importante perché Destroy attende la fine del frame. Senza di esso, il resto di Awake continuerebbe a essere eseguito per la nuova sessione: Instance = this; farebbe puntare tutti gli script a un oggetto che sta per essere distrutto.
Sfida
FacileUn cronometro per speedrun. L'oggetto RunClock in Level1 conta i secondi dell'intera partita e registra uno split ogni volta che si completa un livello. Il Goal dorato di Level1 carica Level2, il cui goal carica di nuovo Level1, e ogni goal chiama prima RunClock.Instance.Split(). Ogni livello ha il proprio HUD con un ClockText; nell'Inspector, a RunClock viene assegnato quello di Level1. Le frecce muovono il Player. Modifica RunClock.cs in modo che:
- il cronometro continui a funzionare a ogni caricamento della scena, senza ripartire da zero;
- il tempo venga sempre mostrato nel
ClockTextdel livello aperto, comeTime: 12.3; - tornando a Level1, che ha un proprio RunClock, ne rimanga comunque uno solo: quello che ha continuato a funzionare, e
RunClock.Instancesia quello.
Premi Play, vai a Level2 e torna indietro, quindi completa di nuovo Level1 e premi Check.
Provalo tu
using UnityEngine;
using TMPro;
public class RunClock : MonoBehaviour
{
public static RunClock Instance;
public TMP_Text clockText;
private float seconds;
void Awake()
{
Instance = this;
}
void Update()
{
seconds += Time.deltaTime;
clockText.text = "Time: " + seconds.ToString("0.0");
}
public void Split()
{
Debug.Log("Split: " + seconds.ToString("0.0"));
}
}
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