mielőtt belevágnánk, hogy mi az eseményrendszer és hogyan lehet azt létrehozni, először beszéljük meg, miért hasznos egy eseményrendszer?
a Unity – ban az alább felsorolt két dolog egyikére támaszkodik, hogy megkapja az adatokat vagy függőségeket egy másik osztálytól.
Ön vagy
a nyilvános vagy sorosított tulajdonságokat egy Monobehaviourba csoportosíthatja, hogy az ellenőrtől hozzárendelje a referenciákat.
vagy
használja a Singleton mintát a kódban, hogy megkapja a szükséges adatokat.
ha még nem ismeri a Singletons tervezési mintát, akkor ez egy szoftvertervezési minta, amely egy osztály példányosítását egyetlen példányra korlátozza. Ez akkor hasznos, ha pontosan egy objektumra van szükség a műveletek koordinálásához a rendszeren keresztül.
ha a kód egy másik objektumának szüksége van az adott objektum adataira, meghívjuk a singleton példányt, hogy hivatkozzon rá. A szinglik nagyon hasznosak azokra az osztályokra való hivatkozáshoz, amelyekről tudod, hogy csak egy példányra lesz szükségük.
függetlenül attól, hogy milyen megközelítést használ a függőségek megszerzéséhez, problémákkal kell szembenéznie, amikor egy kis dolgot módosít vagy a kódot újraírja, különösen, ha nagyon nagy projekten dolgozik.
enyhítsük a függőségeket!
az Eseményrendszerek segítik a kód modulálását azáltal, hogy üzeneteket küldenek olyan osztályok között, amelyek közvetlenül nem tudnak egymásról. Lehetővé teszik, hogy a dolgok reagáljanak egy állapotváltozásra anélkül, hogy folyamatosan figyelnék azt egy frissítési ciklusban. Ez a megfigyelői minta egy formája, amelyben egy tárgy, az úgynevezett alany, listát vezet az eltartottjairól, úgynevezett megfigyelők, és automatikusan értesíti őket az állapotváltozásokról, általában módszereik meghívásával.
értsük meg ezt egy magazin-előfizetés példájával.
- egy magazinkiadó(tárgy) üzleti tevékenységet folytat, és folyóiratokat (adatokat) ad ki.
- ha Ön(adatfelhasználó/megfigyelő) érdeklődik az Ön által feliratkozott(regisztrált) magazin iránt, és ha új kiadást jelentet meg, akkor azt megkapja.
- ha leiratkozik(nem regisztrál), akkor nem kap új kiadásokat.
- a kiadó nem tudja, hogy ki vagy, és hogyan használod a magazint, csak átadja neked, mert előfizető vagy(laza csatolás).
hogyan tervezzük meg az Eseményrendszert?
van egy jelenetem, amiben van egy ThirdPersonController lejátszó(mondjuk Mr.X), egy labirintus és néhány ajtó. Tegyük fel, hogy Mr. X el akarja érni a labirintus kijáratát, de vannak olyan ajtók, amelyek között kinyitható, amint Mr.X közel áll hozzájuk.
az ajtók trigger box collider, amely kiváltja a másik ütköző részt vesz ebben az ütközésben.
valósítsuk meg ezt egy eseményrendszer segítségével.
kezdjük azzal, hogy hozzáadunk egy GameObject-et a jelenethez, és hozzáadunk egy új szkriptet, az EventsManager-t.cs
első eseményeink azok lesznek, amelyek akkor lőnek, amikor játékosunk belép vagy kilép az ajtó kioldó területére.
erre az EventsManager alkalmazásban.cs osztály, hozzon létre két esemény műveletek DoorTriggerEnter és DoorTriggerExit is, módszerek, amelyek hivatkozhat a megfelelő esemény akció. Is, hozzon létre egy statikus singleton referencia az osztály.
olyan tárgyakra van szükségünk, amelyek tüzelhetnek és aláírhatják ezeket az eseményeket. Ehhez hozzon létre két osztályt, egyet az ajtóhoz, a Doorkontrollerhez.cs, és egy az ajtó kioldójához, DoorTrigger.cs.
a Doorkontrollerben.cs, hozzon létre két módszer, hogy lehet hallgatni, ha valaki tüzek DoorTriggerEnter vagy DoorTriggerExit események és feladataik ellátására. A Doorkontroller indítási metódusában az EventsManager osztály eseményeit a statikus példány használatával érheti el, majd iratkozzon fel a megfelelő metódusra.
most, rendezvényeink készen állnak, az előfizetők pedig hallgatják ezeket az eseményeket. Tehát a DoorTrigger osztályban csak az OnTriggerEnter módszerrel kell tüzelnünk ezeket az eseményeket.
Oké.. tehát csatoljuk a Doorkontroller és a DoorTrigger szkriptet minden ajtóhoz és trigger területhez, és játsszuk le a jelenetet.
Uhh Ohh! Van egy probléma…
az EventManager egy singleton osztály, és minden ajtó trigger meghívja az eseményt, és minden ajtó vezérlő hallgat és reagál ugyanarra az eseményre. Át kell adnunk néhány egyedi azonosítót az esemény meghívása közben, hogy csak az azonos azonosítóval rendelkező ajtó hallgassa meg az eseményt.
esetünkben a triggerek és az ajtó szülőobjektuma ugyanaz. Tehát átadhatjuk a szülő gameobject példányazonosítóját.
játsszuk le a jelenetet..
Yeahhh.. úgy működik, ahogy vártuk.
ügyeljen arra, hogy leiratkozzon ezekről az eseményekről, mivel ezek nem kívánt hibákhoz vezethetnek. Például, ha futás közben elpusztítja az ajtót stb.
szóval, így tudjuk, hogy a mi egyszerű esemény rendszer.
ennyi az emberek számára… Boldog Kódolás! 🙂