Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Piovono 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 pubblico Instance di tipo GameManager e assegnagli questo script in Awake.
  • In Meteor.cs, elimina il campo game e invia le segnalazioni tramite GameManager.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;
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Creare veri giochi