Menu
CoddyTech

Il Singleton

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 13 di 60.

Un riferimento dell'Inspector ha bisogno di un oggetto su cui trascinare qualcosa. I nemici che uno spawner crea durante il gioco provengono da un prefab, e un prefab può puntare 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 sé stesso in un campo a cui ogni script può accedere 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, a cui si accede con il nome della classe: GameManager.Instance. Qualsiasi script può leggerla, compreso un nemico generato un minuto fa, senza dover compilare un proprio campo.

Il manager 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 sé stesso; il capitolo Scenes and Levels mostra come impedirlo.

challenge icon

Sfida

Facile

Fai sì che le meteore raggiungano GameManager tramite un singleton.

  1. In GameManager.cs, aggiungi public static GameManager Instance; e un metodo Awake() con Instance = this;.
  2. In Meteor.cs, elimina il campo game e chiama invece GameManager.Instance.MeteorLanded() e GameManager.Instance.MeteorCaught().

Premi «Gioca» e cattura una meteora: viene visualizzato Caught: 1, senza errori nella Console. Poi premi «Verifica».

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;
    }
}

Tutte le lezioni di Creare veri giochi

Esercitati da solo: Playground Unity