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.
Wyzwanie
ŁatwySpadają 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.csdodaj publiczne pole statyczneInstancetypu GameManager i przypisz do niego ten skrypt w metodzie Awake. - W pliku
Meteor.csusuń polegamei zamiast niego przekazuj informacje za pośrednictwemGameManager.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;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Tworzenie prawdziwych gier
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz4Sceny i poziomy
Wczytaj scenęUruchom poziom ponownieNastępny poziomZachowaj między scenamiPodsumowanie: wybór poziomu10Projekt: platformówka 3D
TrasaRuchome platformy2Przyciski 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ą