Il Singleton
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 13 di 56.
Un riferimento nell'Inspector ha bisogno di un elemento su cui poter trascinare qualcosa. I nemici che uno spawner crea durante il gioco provengono da un prefab, e un prefab può fare riferimento solo ad asset e alle proprie parti, mai a un oggetto in una scena, quindi il loro campo GameManager è vuoto. La soluzione abituale è un singleton: GameManager memorizza se stesso in un campo che ogni script può raggiungere tramite il nome della classe.
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private int kills;
void Awake()
{
Instance = this;
}
public void EnemyDown()
{
kills++;
Debug.Log("Kills: " + kills);
}
}// Enemy.cs, sul prefab del nemico
public void Die()
{
GameManager.Instance.EnemyDown();
Destroy(gameObject);
}static significa che il campo appartiene alla classe, non a un oggetto. Ogni oggetto GameManager avrebbe il proprio kills, ma nell'intero gioco c'è una sola Instance, e puoi raggiungerla tramite il nome della classe: GameManager.Instance. Qualsiasi script può leggerla, compreso un nemico generato un minuto fa, senza dover compilare un campo proprio.
Il gestore imposta Instance = this; in Awake, dove this è lo script stesso. Unity esegue tutti gli Awake nella scena prima di qualsiasi Start, quindi gli altri script possono usare GameManager.Instance a partire dal proprio Start. Un secondo GameManager nella scena sovrascriverebbe Instance con se stesso; il capitolo Scene e livelli mostra come impedirlo.
Sfida
FacilePiovono meteoriti. Lo Spawner rilascia un Meteor da un prefab ogni 1.5 secondi, le frecce muovono il Player e GameManager conta una cattura con MeteorCaught() e un meteorite che colpisce il terreno con MeteorLanded(). Quegli script sono pronti.
Lo script Meteor invia le segnalazioni tramite il suo campo game, ma i meteoriti provengono da un prefab, quindi game è vuoto e ogni segnalazione fallisce. Risolvi il problema con un singleton:
- In
GameManager.cs, aggiungi un campo statico pubblicoInstancedi tipo GameManager e assegnagli questo script in Awake. - In
Meteor.cs, elimina il campogamee invia le segnalazioni tramiteGameManager.Instance.
Premi Play, cattura alcuni meteoriti e lasciane passare altri, poi premi Check.
Provalo tu
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public TMP_Text caughtText;
public TMP_Text shieldText;
private int caught;
private int shield = 3;
public void MeteorCaught()
{
caught++;
caughtText.text = "Caught: " + caught;
}
public void MeteorLanded()
{
shield--;
shieldText.text = "Shield: " + shield;
}
}
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