Menu
CoddyTech

Singleton

Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 13 z 56.

Odwołanie w Inspektorze wymaga obiektu, na który można je przeciągnąć. Wrogowie tworzeni przez generator podczas gry pochodzą z prefabrykatu, a prefabrykat może wskazywać tylko zasoby i własne elementy, nigdy obiekt w scenie, więc ich pole GameManager jest puste. Zwykle rozwiązuje się to za pomocą singletona: GameManager zapisuje siebie w polu, do którego każdy skrypt ma dostęp za pośrednictwem nazwy klasy.

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, na prefabie przeciwnika
public void Die()
{
    GameManager.Instance.EnemyDown();
    Destroy(gameObject);
}

static oznacza, że pole należy do klasy, a nie do obiektu. Każdy obiekt GameManager miałby własne kills, ale w całej grze istnieje tylko jedno Instance, do którego odwołujesz się za pomocą nazwy klasy: GameManager.Instance. Każdy skrypt może je odczytać, także wróg utworzony minutę temu, bez konieczności uzupełniania własnego pola.

Menedżer ustawia Instance = this; w Awake, gdzie this oznacza sam skrypt. Unity uruchamia wszystkie funkcje Awake w scenie przed dowolną funkcją Start, więc inne skrypty mogą korzystać z GameManager.Instance od momentu uruchomienia ich funkcji Start. Drugi GameManager w scenie nadpisałby Instance własną wartością; rozdział Sceny i poziomy pokazuje, jak temu zapobiec.

challenge icon

Wyzwanie

Łatwy

Spadają meteory. Spawner upuszcza Meteor z prefabrykatu co 1.5 sekundy, strzałki poruszają graczem, a GameManager zlicza złapane meteory za pomocą MeteorCaught() oraz meteory, które uderzyły w ziemię, za pomocą MeteorLanded(). Te skrypty są gotowe.

Skrypt Meteor przekazuje informacje za pośrednictwem pola game, ale meteory pochodzą z prefabrykatu, więc game jest puste i każde zgłoszenie kończy się niepowodzeniem. Napraw to za pomocą singletona:

  • W pliku GameManager.cs dodaj publiczne pole statyczne Instance typu GameManager i przypisz do niego ten skrypt w metodzie Awake.
  • W pliku Meteor.cs usuń pole game i zamiast niego przekazuj informacje za pośrednictwem GameManager.Instance.

Naciśnij Play, złap kilka meteorów i pozwól kilku spaść, a następnie kliknij Check.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier