Menu
CoddyTech

Singleton

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

Do odwołania z Inspektora potrzebny jest obiekt, 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 części, nigdy obiekt w scenie, dlatego ich pole GameManager jest puste. Zwykle rozwiązuje się to za pomocą singletonu: GameManager zapisuje się w polu, do którego każdy skrypt może uzyskać dostęp przez nazwę 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 uzyskujesz dostęp przez nazwę 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 metody Awake w scenie przed dowolną metodą Start, więc inne skrypty mogą korzystać z GameManager.Instance od chwili uruchomienia ich metody Start. Drugi GameManager w scenie nadpisałby Instance własnym obiektem; w rozdziale Sceny i poziomy pokazano, jak temu zapobiec.

challenge icon

Wyzwanie

Łatwy

Pozwól meteorom docierać do GameManagera za pomocą singletona.

  1. W pliku GameManager.cs dodaj public static GameManager Instance; oraz metodę Awake() z Instance = this;.
  2. W pliku Meteor.cs usuń pole game i zamiast niego wywołuj GameManager.Instance.MeteorLanded() oraz GameManager.Instance.MeteorCaught().

Naciśnij „Graj” i złap meteor: pojawi się Caught: 1, a w konsoli nie będzie błędów. Następnie naciśnij „Sprawdź”.

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

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier

Poćwicz samodzielnie: Edytor online Unity