lad os opbygge et brugerdefineret Begivenhedssystem i Unity3D

Akshay Arora
Akshay Arora

Følg

3. maj 2020 * 5 min læsning

før vi hopper ind i, hvad der er et begivenhedssystem, og hvordan man laver det, lad os først diskutere, hvorfor er det nyttigt at have et begivenhedssystem?

i Unity vil du stole på en af de to ting, der er anført nedenfor for at få data eller afhængigheder fra en anden klasse.

du enten

flok dine offentlige eller serialiserede egenskaber i en Monobehaviour for at kunne tildele det fra inspektøren for at få referencerne.

eller

brug Singleton-mønsteret i din kode for at få de data, du har brug for.

hvis du ikke allerede er opmærksom på Singletons designmønster, er det et programdesignmønster, der begrænser instantieringen af en klasse til en enkelt forekomst. Dette er nyttigt, når nøjagtigt et objekt er nødvendigt for at koordinere handlinger på tværs af systemet.

hvis et andet objekt i koden har brug for data fra det objekt, kalder vi singleton-forekomsten for at henvise til den. Singletoner er meget nyttige til at henvise til de klasser, som du ved, kun har brug for en forekomst af det.

uanset hvilken tilgang du bruger til at få afhængighederne, vil du stå over for problemer, når du justerer en lille ting eller refactoring koden, især hvis du arbejder på et meget stort projekt.

lad os lindre afhængighederne!

Begivenhedssystemer hjælper med at modulere din kode ved at sende meddelelser mellem klasser, der ikke direkte kender hinanden. De tillader ting at reagere på en ændring i en tilstand uden konstant at overvåge det i en opdateringssløjfe. Det er en form for Observatørmønster, hvor et objekt, kaldet emnet, opretholder en liste over dets afhængige, kaldet observatører, og underretter dem automatisk om eventuelle tilstandsændringer, normalt ved at kalde deres metoder.

lad os forstå dette ved et eksempel på et magasinabonnement.

  • en magasinudgiver(emne) er i branchen og udgiver magasiner (data).
  • hvis du(bruger af data/observatør) er interesseret i det Magasin, du abonnerer(Registrer), og hvis en ny udgave udgives, bliver den leveret til dig.
  • hvis du afmelder(Afmeld), stopper du med at få nye udgaver.
  • Udgiver ved ikke, hvem du er, og hvordan du bruger magasinet, det leverer det bare til dig, fordi du er abonnent(løs kobling).

sådan designer du Begivenhedssystemet?

jeg har en scene, hvor vi har en thirdpersoncontroller-spiller, en labyrint og nogle døre. Lad os sige Hr. Men der er nogle døre i mellem, som kan åbnes, så snart HR.

dørene har trigger boks collider, der udløser den anden collider involveret i denne kollision.

lad os implementere dette ved hjælp af et begivenhedssystem.

lad os starte med at tilføje et GameObject i scenen og tilføje et nyt script kaldet EventsManager.cs

vores første begivenheder vil være dem, der skyder, når vores spiller kommer ind eller ud af dørens udløserområde.

For det, i EventsManager.cs klasse, Opret to begivenhedshandlinger DoorTriggerEnter og Doortriggereksit, også, metoder, der kan påberåbe sig den respektive begivenhedshandling. Opret også en statisk Singleton-reference til klassen.

nu har vi brug for genstande, der kan skyde og abonnere på disse begivenheder. For at skabe to klasser, en til døren, DoorController.cs, og en til dørens udløserområde, DoorTrigger.cs.

i DoorController.cs, Opret to metoder, der kan lytte, når nogen fyrer DoorTriggerEnter eller Doortriggerudse begivenheder og udføre deres opgaver. I Doorcontrollerens startmetode skal du få adgang til begivenhederne fra EventsManager-klassen ved hjælp af den statiske forekomst og abonnere på dens respektive metode.

nu er vores begivenheder klar, og abonnenter lytter til disse begivenheder. Så I DoorTrigger-klassen skal vi bare affyre disse begivenheder i ontriggerenter-metoden.

Okay.. så lad os vedhæfte DoorController og DoorTrigger script til hver dør og trigger område henholdsvis og spille scenen.

Uhh Ohh! Der er et problem…

vores EventManager er en singleton-klasse, og hver dørudløser påberåber sig begivenheden, og hver dørcontroller lytter og reagerer på den samme begivenhed. Vi er nødt til at videregive noget unikt id, mens vi påberåber begivenheden, så kun døren, der har det samme id, lytter til den begivenhed.
i vores særlige tilfælde er udløsere og dørens overordnede objekt de samme. Så vi kan passere instans-id ‘ et for forældrenes spilobjekt.

lad os spille scenen..

Yeahhh.. det fungerer som forventet nu.

sørg for at afmelde disse begivenheder, da de kan føre dig til nogle uønskede fejl. For eksempel, hvis du ødelægger din dør ved kørsel osv.

så det er sådan, Vi kan lave vores enkle begivenhedssystem.

det er alt for nu folkens… Glad Kodning! 🙂

You might also like

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.