să construim un sistem de evenimente personalizat în Unity3D

Akshay Arora
Akshay Arora

urmați

mai 3, 2020 * 5 min citit

înainte de a sări în ceea ce este un sistem de evenimente și cum să îl realizăm, să discutăm mai întâi de ce este util să avem un sistem de evenimente?

în Unity, vă veți baza pe unul dintre cele două lucruri enumerate mai jos pentru a obține datele sau dependențele dintr-o altă clasă.

fie

grupați proprietățile dvs. publice sau serializate într-un Monobehaviour pentru a le putea atribui inspectorului pentru a obține referințele.

sau

utilizați modelul Singleton din codul dvs. pentru a obține datele de care aveți nevoie.

dacă nu sunteți deja conștienți de modelul de proiectare Singletons, este un model de proiectare software care restricționează instanțierea unei clase la o singură instanță. Acest lucru este util atunci când este necesar exact un obiect pentru a coordona acțiunile din sistem.

dacă un alt obiect din cod are nevoie de date de la acel obiect, numim instanța singleton pentru a se referi la acesta. Singletons sunt foarte utile pentru a se referi la clasele care știți că vor avea nevoie de o singură instanță a acesteia.

indiferent de abordarea pe care o utilizați pentru a obține dependențele, vă veți confrunta cu probleme atunci când modificați un lucru mic sau refactorizați Codul, mai ales dacă lucrați la un proiect foarte mare.

să atenuăm dependențele!

sistemele de evenimente vă ajută să vă modularizați codul prin trimiterea de mesaje între clase care nu știu direct unele despre altele. Acestea permit lucrurilor să răspundă la o schimbare a unei stări fără a o monitoriza constant într-o buclă de actualizare. Este o formă de model de observator în care un obiect, numit subiect, menține o listă a dependenților săi, numiți observatori, și îi notifică automat cu privire la orice modificare a stării, de obicei apelând metodele lor.

să înțelegem acest lucru printr-un exemplu de abonament la reviste.

  • un editor de reviste(subiect) este în afaceri și publică reviste (date).
  • dacă dvs.(utilizator de date/observator) sunteți interesat de revista pe care o abonați (înregistrați-vă) și dacă o nouă ediție este publicată, aceasta vă este livrată.
  • dacă vă dezabonați (anulați înregistrarea), nu mai primiți ediții noi.
  • editorul nu știe cine ești și cum folosești revista, ci doar ți-o livrează pentru că ești abonat(cuplare liberă).

cum se proiectează sistemul de evenimente?

am o scenă în care avem un jucător ThirdPersonController(spune domnul X), un labirint și câteva uși. Să zicem că dl. X vrea să ajungă la ieșirea din labirint, dar există unele uși între care pot fi deschise de îndată ce domnul X ajunge aproape de ei.

ușile au cutie de declanșare collider care declanșează celălalt collider implicat în această coliziune.

să implementăm acest lucru folosind un sistem de evenimente.

să începem prin adăugarea unui GameObject în scenă și adăugarea unui nou script numit EventsManager.cs

primele noastre evenimente vor fi cele care se vor declanșa atunci când jucătorul nostru intră sau iese din zona de declanșare a ușii.

pentru asta, în EventsManager.clasa cs, creați două acțiuni eveniment DoorTriggerEnter și DoorTriggerExit, de asemenea, metode care pot invoca acțiunea evenimentului respectiv. De asemenea, creați o referință singleton statică pentru clasă.

acum, avem nevoie de obiecte care pot trage și abona la aceste evenimente. Pentru că a crea două clase, una pentru ușă, DoorController.cs, și unul pentru zona de declanșare a ușii, DoorTrigger.cs.

în controlerul ușii.cs, a crea două metode care pot asculta atunci când cineva trage DoorTriggerEnter sau DoorTriggerExit evenimente și îndeplini sarcinile. În metoda de pornire a DoorController, accesați evenimentele din clasa EventsManager utilizând instanța statică și abonați-vă la metoda respectivă.

acum, evenimentele noastre sunt gata și abonații ascultă aceste evenimente. Deci, în clasa DoorTrigger, trebuie doar să declanșăm acele evenimente în metoda OnTriggerEnter.

bine.. deci, să atașăm doorcontroller și doortrigger script la fiecare ușă și zona de declanșare respectiv și să se joace scena.

Uhh Ohh! E o problemă…

EventManager nostru este o clasă singleton și fiecare declanșator ușă invocă evenimentul și fiecare controler de ușă este de a asculta și de a răspunde la același eveniment. Trebuie să trecem un id unic în timp ce invocăm evenimentul, astfel încât numai ușa care are același id să asculte acel eveniment.
în cazul nostru particular, declanșatoarele și obiectul părinte al ușii sunt aceleași. Deci, putem trece ID-ul de instanță al gameobject-ului părintelui.

să jucăm scena..

Dahhh.. funcționează așa cum era de așteptat acum.

asigurați-vă că dezabonați aceste evenimente, deoarece acestea vă pot duce la unele erori nedorite. De exemplu, dacă vă distrugeți ușa în timpul rulării etc.

deci, așa putem face sistemul nostru simplu de evenimente.

asta e tot pentru acum oameni buni… Codificare Fericit! 🙂

You might also like

Lasă un răspuns

Adresa ta de email nu va fi publicată.