innan vi hoppar in i vad som är ett händelsesystem och hur man gör det, låt oss först diskutera varför är det användbart att ha ett händelsesystem?
i Unity kommer du att förlita dig på en av de två sakerna nedan för att få data eller beroenden från en annan klass.
du antingen
buntar dina offentliga eller serialiserade egenskaper i en Monobehaviour för att kunna tilldela den från inspektören för att få referenserna.
eller
använd Singleton-mönstret i din kod för att få de data du behöver.
om du inte redan är medveten om Singletons designmönster är det ett mjukvarudesignmönster som begränsar instantiationen av en klass till en enda instans. Detta är användbart när exakt ett objekt behövs för att samordna åtgärder över hela systemet.
om ett annat objekt i koden behöver data från det objektet, kallar vi singleton-instansen för att hänvisa till den. Singletons är mycket användbara för att hänvisa till de klasser som du vet kommer att behöva bara en instans av det.
oavsett vilket tillvägagångssätt du använder för att få beroenden, kommer du att möta problem när du justerar en liten sak eller refactoring koden, speciellt om du arbetar med ett mycket stort projekt.
låt oss lindra beroenden!
Händelsesystem hjälper modularisera din kod genom att skicka meddelanden mellan klasser som inte direkt vet om varandra. De tillåter saker att svara på en förändring i ett tillstånd utan att ständigt övervaka det i en uppdateringsslinga. Det är en form av Observatörsmönster där ett objekt, kallat ämnet, upprätthåller en lista över sina anhöriga, kallade observatörer och meddelar dem automatiskt om eventuella tillståndsändringar, vanligtvis genom att ringa deras metoder.
låt oss förstå detta med ett exempel på en tidningsprenumeration.
- en tidningsutgivare (ämne) är i branschen och publicerar tidskrifter (data).
- om du(användare av data/observatör) är intresserad av tidningen du prenumererar (registrerar), och om en ny utgåva publiceras blir den levererad till dig.
- om du avregistrerar dig(avregistrerar) slutar du få nya utgåvor.
- Publisher vet inte vem du är och hur du använder tidningen, det bara levererar det till dig eftersom du är en abonnent(lös koppling).
hur man utformar Händelsesystemet?
jag har en scen där vi har en ThirdPersonController-spelare(säg Mr.X), en labyrint och några dörrar. Låt oss säga Mr. X vill nå utgången av labyrinten men det finns några dörrar mellan vilka kan öppnas så snart Mr X når nära dem.
dörrarna har trigger box collider som utlöser den andra collider som är involverad i denna kollision.
låt oss implementera detta med hjälp av ett händelsesystem.
låt oss börja med att lägga till ett GameObject i scenen och lägga till ett nytt skript som heter EventsManager.cs
våra första händelser kommer att vara de som kommer att skjuta när vår spelare går in eller lämnar dörrens utlösningsområde.
för det, i EventsManager.cs klass, skapa två händelse åtgärder DoorTriggerEnter och DoorTriggerExit, också, metoder som kan åberopa respektive händelse åtgärd. Skapa också en statisk singleton-referens för klassen.
nu behöver vi föremål som kan avfyra och prenumerera på dessa händelser. För att skapa två klasser, en för dörren, DoorController.cs, och en för dörrens utlösningsområde, DoorTrigger.cs.
i DoorController.cs, skapa två metoder som kan lyssna när någon bränder DoorTriggerEnter eller DoorTriggerExit händelser och utföra sina uppgifter. Gå till händelserna från klassen EventsManager med hjälp av den statiska instansen i startmetoden för DoorController och prenumerera på dess respektive metod.
nu är våra evenemang redo och prenumeranter lyssnar på dessa händelser. Så i doortrigger-klassen behöver vi bara avfyra dessa händelser i OnTriggerEnter-metoden.
okej.. så låt oss fästa DoorController och DoorTrigger script till varje dörr och trigger område respektive och spela scenen.
Uhh Ohh! Det finns ett problem…
vår EventManager är en singleton klass och varje dörr trigger åberopar händelsen och varje dörr controller lyssnar och svarar på samma händelse. Vi måste skicka ett unikt id medan vi åberopar händelsen så att endast dörren som har samma id kommer att lyssna på den händelsen.
i vårt speciella fall är utlösare och dörrens överordnade objekt samma. Så vi kan skicka instans-id för förälderns spelobjekt.
Låt oss spela scenen..
Yeahhh.. det fungerar som förväntat nu.
se till att avregistrera dessa händelser eftersom de kan leda dig till några oönskade fel. Till exempel, om du förstör din dörr vid körning etc.
så det är så vi kan göra vårt enkla händelsesystem.
det är allt för nu folk… Lycklig Kodning! 🙂