Før du hopper inn i hva er et hendelsessystem og hvordan du gjør det, la oss først diskutere hvorfor er det nyttig å ha et hendelsessystem?
I Unity vil du stole på en av de to tingene som er oppført nedenfor for å få dataene eller avhengighetene fra en annen klasse.
du Enten
Samle dine offentlige eller serialiserte egenskaper i En Monobehaviour for å kunne tilordne den fra inspektøren for å få referansene.
Eller
Bruk Singleton-mønsteret i koden din for å få dataene du trenger.
hvis Du ikke allerede er klar over Enkeltfødte designmønster, er det et programvaredesign mønster som begrenser instanseringen av en klasse til en enkelt forekomst. Dette er nyttig når nøyaktig ett objekt er nødvendig for å koordinere handlinger over hele systemet.
hvis et annet objekt i koden trenger data fra det objektet, kaller vi singleton-forekomsten for å referere til den. Enkeltfødte er svært nyttig å referere til klasser som du vet kommer til å trenge bare en forekomst av det.
Uansett hvilken tilnærming du bruker for å få avhengighetene, vil du møte problemer når du tilpasser en liten ting eller refactoring koden, spesielt hvis du jobber med et veldig stort prosjekt.
La oss lindre avhengighetene!
Hendelsessystemer hjelper deg med å modulere koden din ved å sende meldinger mellom klasser som ikke direkte vet om hverandre. De tillater ting å reagere på en endring i en tilstand uten å konstant overvåke den i en oppdateringssløyfe. Det er En Form For Observatørmønster der et objekt, kalt emnet, opprettholder en liste over sine avhengige, kalt observatører, og varsler dem automatisk om eventuelle tilstandsendringer, vanligvis ved å ringe deres metoder.
La oss forstå dette ved et eksempel på et magasinabonnement.
- et magasin utgiver(emne) er i bransjen og utgir magasiner (data).
- hvis du (bruker av data/observatør) er interessert i bladet du abonnerer på( registrer), og hvis en ny utgave blir publisert, blir den levert til deg.
- hvis du unsubscribe (avregistrere) du slutter å få nye utgaver.
- Utgiver vet ikke hvem du er og hvordan du bruker bladet, det leverer bare det til deg fordi du er abonnent (løs kobling).
hvordan designe Hendelsessystemet?
jeg har en scene der vi har En ThirdPersonController-spiller (si Mr. X), en labyrint og noen dører. Nå, La Oss si Mr. X ønsker å nå utgangen av labyrinten, men det er noen dører i mellom som kan åpnes så snart Mr. X når nær dem.
dørene har trigger box collider som utløser den andre collider involvert i denne kollisjonen.
la oss implementere dette ved hjelp av et hendelsessystem.
la oss begynne med å legge Til Et GameObject i scenen og legge til Et nytt skript kalt EventsManager.cs
Våre første hendelser vil være de som vil skyte når vår spiller kommer inn eller ut av utløserområdet på døren.
For det, I EventsManager.cs-klasse, opprett To hendelseshandlinger DoorTriggerEnter og DoorTriggerExit, også metoder som kan påkalle den respektive hendelseshandlingen. Lag også en statisk singleton referanse for klassen.
nå trenger vi objekter som kan brenne og abonnere på disse hendelsene. For at opprette to klasser, en for døren, DoorController.cs, og en for dørens utløserområde, DoorTrigger.cs.
I DoorController.cs, lage to metoder som kan lytte når noen branner DoorTriggerEnter eller DoorTriggerExit hendelser og utføre sine oppgaver. I startmetoden Til DoorController får du tilgang til hendelsene fra EventsManager-klassen ved hjelp av den statiske forekomsten, og abonnerer på den respektive metoden.
nå er våre arrangementer klare og abonnenter lytter til disse hendelsene. Så, I DoorTrigger-klassen, trenger vi bare å brenne disse hendelsene I OnTriggerEnter-metoden.
Ok.. så la oss feste DoorController og DoorTrigger script til hver dør og utløse området henholdsvis og spille scenen.
Uhh Ohh! Det er ett problem…
Vår EventManager er en singleton-klasse, og hver dørutløser påkaller arrangementet, og hver dørkontroller lytter og svarer på den samme hendelsen. Vi må passere noen unike id mens påkalle hendelsen slik at bare døren som har samme id vil lytte til den hendelsen.
i vårt spesielle tilfelle er utløsere og dørens overordnede objekt det samme. Så, vi kan sende forekomsten id av foreldrenes spillobjekt.
la oss spille scenen..
Yeahhh.. det fungerer som forventet nå.
Sørg for å avslutte abonnementet disse hendelsene som de kan føre deg til noen uønskede feil. For eksempel, hvis du ødelegger døren din ved kjøretid, etc.
Så det er slik vi kan lage vårt enkle hendelsessystem.
det er alt for nå folkens… Glad Koding! 🙂