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.
Wyzwanie
ŁatwyPozwól meteorom docierać do GameManagera za pomocą singletona.
- W pliku
GameManager.csdodajpublic static GameManager Instance;oraz metodęAwake()zInstance = this;. - W pliku
Meteor.csusuń polegamei zamiast niego wywołujGameManager.Instance.MeteorLanded()orazGameManager.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
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz2Przyciski i ekrany
Przyciski i onClickLambdyPodłączanie w InspectorzeWłączanie i wyłączanie paneliPaski zdrowiaPodsumowanie: sklep z ulepszeniami5Zapisywanie za pomocą PlayerPrefs
Zapisz liczbęWczytywanie z wartością domyślnąNajlepszy wynikZapisz ustawieniaPodsumowanie: monety w banku3Menedżer gry
Jeden skrypt obsługuje gręSingletonStany gryInstrukcja switch dla stanuPowtórka: menedżer rund6Projekt: Niekończący się bieg
Trzy toryPrzeszkody przed tobąPoćwicz samodzielnie: Edytor online Unity