zbudujmy własny system zdarzeń w Unity3D

Akshay Arora
Akshay Arora

Obserwuj

Może 3, 2020 * 5 min czytać

zanim przejdziemy do tego, czym jest system eventowy i jak go stworzyć, omówmy najpierw, dlaczego warto mieć system eventowy?

w Unity będziesz polegał na jednej z dwóch rzeczy wymienionych poniżej, aby uzyskać dane lub zależności od innej klasy.

możesz

połączyć swoje publiczne lub serializowane właściwości w Monobehaviour, aby móc przypisać je od inspektora, aby uzyskać referencje.

lub

użyj wzorca Singleton w kodzie, aby uzyskać potrzebne dane.

jeśli nie znasz wzorca projektowego Singletons, jest to wzorzec projektowy oprogramowania, który ogranicza instancję klasy do jednej instancji. Jest to przydatne, gdy do koordynowania działań w całym systemie potrzebny jest dokładnie jeden obiekt.

jeśli inny obiekt w kodzie potrzebuje danych z tego obiektu, wywołujemy instancję singleton, aby się do niej odwołać. Singletony są bardzo przydatne, aby odnieść się do klas, o których wiesz, że będą potrzebować tylko jednej instancji.

niezależnie od tego, jakiego podejścia używasz, aby uzyskać zależności, napotkasz problemy podczas poprawiania małej rzeczy lub refaktoryzacji kodu, zwłaszcza jeśli pracujesz nad bardzo dużym projektem.

złagodzmy zależności!

Systemy zdarzeń pomagają modularyzować kod, wysyłając wiadomości między klasami, które nie wiedzą bezpośrednio o sobie. Pozwalają one reagować na zmiany w stanie bez ciągłego monitorowania go w pętli aktualizacji. Jest to forma wzorca obserwatora, w którym obiekt, zwany podmiotem, utrzymuje listę swoich zależności, zwanych obserwatorami i powiadamia ich automatycznie o wszelkich zmianach stanu, zwykle wywołując ich metody.

zrozummy to na przykładzie prenumeraty magazynu.

  • wydawca czasopisma (podmiot) prowadzi działalność gospodarczą i wydaje czasopisma (dane).
  • jeśli ty(użytkownik danych/obserwator) jesteś zainteresowany czasopismem Subskrybuj(Zarejestruj się), a jeśli pojawi się nowe wydanie, zostanie ono do ciebie Dostarczone.
  • po wypisaniu się (wyrejestrowaniu) przestajesz otrzymywać nowe edycje.
  • Wydawca nie wie kim jesteś i w jaki sposób korzystasz z magazynu, po prostu dostarcza ci go, ponieważ jesteś abonentem(luźne połączenie).

jak zaprojektować system eventowy?

mam scenę, w której mamy trzeciego gracza kontrolera (powiedzmy pana X), labirynt i kilka drzwi. Teraz, powiedzmy, że Mr. X chce dotrzeć do wyjścia z labiryntu, ale istnieją pewne drzwi, pomiędzy którymi można otworzyć, gdy tylko pan X osiągnie blisko nich.

drzwi mają spust box collider, który wyzwala drugiego Zderzacza biorącego udział w tej kolizji.

zaimplementujmy to za pomocą systemu zdarzeń.

zacznijmy od dodania obiektu GameObject w scenie i dodania nowego skryptu o nazwie EventsManager.cs

nasze pierwsze wydarzenia będą tymi, które będą strzelać, gdy nasz gracz wejdzie lub wyjdzie z obszaru spustu drzwi.

w tym celu, w EventsManager.Klasa cs, utwórz dwie akcje zdarzenia DoorTriggerEnter i doortriggerexit, również metody, które mogą wywołać odpowiednią akcję zdarzenia. Ponadto, Utwórz statyczne odniesienie singleton dla klasy.

teraz potrzebujemy obiektów, które mogą strzelać i subskrybować te wydarzenia. W tym celu utwórz dwie klasy, jedną dla door, DoorController.cs, i jeden na obszar spustu drzwi, DoorTrigger.cs.

w DoorController.cs, utwórz dwie metody, które mogą nasłuchiwać, gdy ktoś odpala zdarzenia DoorTriggerEnter lub doortriggerexit i wykonywać swoje zadania. W metodzie Start kontrolera DoorController można uzyskać dostęp do zdarzeń z klasy EventsManager za pomocą instancji statycznej i zapisać się do odpowiedniej metody.

teraz nasze wydarzenia są gotowe, a subskrybenci słuchają tych wydarzeń. Tak więc, w klasie DoorTrigger, musimy tylko odpalić te zdarzenia w metodzie OnTriggerEnter.

ok.. Załóżmy więc skrypt DoorController i doortrigger odpowiednio do każdego obszaru drzwi i wyzwalacza i odtwórz scenę.

Uhh Ohh! Jest jeden problem…

nasz EventManager jest klasą singleton i każdy WYZWALACZ drzwi wywołuje zdarzenie, a każdy kontroler drzwi nasłuchuje i reaguje na to samo zdarzenie. Musimy przekazać jakiś unikalny identyfikator podczas wywoływania zdarzenia, aby tylko drzwi, które mają ten sam IDENTYFIKATOR, posłuchały tego zdarzenia.
w naszym szczególnym przypadku wyzwalacze i obiekt nadrzędny door są takie same. Możemy więc przekazać ID instancji obiektu gameobject rodzica.

Zagrajmy scenę..

tak.. teraz działa zgodnie z oczekiwaniami.

pamiętaj, aby anulować subskrypcję tych zdarzeń, ponieważ mogą one prowadzić do niepożądanych błędów. Na przykład, jeśli zniszczysz drzwi w czasie pracy itp.

tak więc możemy stworzyć nasz prosty system zdarzeń.

to wszystko na razie ludzie… Szczęśliwego Kodowania! 🙂

You might also like

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.