Před skokem do, co je událost systému a jak na to, nejprve probereme, proč je to užitečné mít systém událostí?
v Unity se budete spoléhat na jednu ze dvou níže uvedených věcí, abyste získali data nebo závislosti z jiné třídy.
Banda své veřejné nebo serializovat vlastnosti v Monobehaviour být schopen přiřadit ji od inspektora získat odkazy.
nebo
použijte vzor Singleton v kódu k získání potřebných dat.
pokud si ještě nejste vědomi vzoru návrhu Singletonů, jedná se o návrhový vzor softwaru, který omezuje instanci třídy na jednu instanci. To je užitečné, když je pro koordinaci akcí v systému potřeba přesně jeden objekt.
pokud jiný objekt v kódu potřebuje data z tohoto objektu, zavoláme instanci singleton, aby se na něj odkazovala. Singletony jsou velmi užitečné pro odkazování na třídy, o kterých víte, že budou potřebovat pouze jednu instanci.
bez ohledu na to, jaký přístup používáte k získání závislostí, budete čelit problémům při ladění malé věci nebo refaktorování kódu, zejména pokud pracujete na velmi velkém projektu.
pojďme zmírnit závislosti!
eventové systémy pomáhají modularizovat váš kód zasíláním zpráv mezi třídami, které o sobě přímo nevědí. Umožňují věci reagovat na změnu stavu, aniž by je neustále sledovaly v aktualizační smyčce. Jedná se o formu Pozorovatelského vzoru, ve kterém objekt, nazvaný subjekt, udržuje seznam svých závislých, volal pozorovatele, a automaticky je upozorní na jakékoli změny stavu, obvykle voláním jejich metod.
pojďme to pochopit na příkladu předplatného časopisu.
- vydavatel časopisu(předmět) je v podnikání a vydává časopisy (data).
- Máte-li(uživatel dat/pozorovatel) zájem o časopis, který se přihlásíte (zaregistrujete), a pokud bude vydáno nové vydání, bude vám doručeno.
- pokud se odhlásíte (odhlásíte), přestanete dostávat nová vydání.
- Vydavatel neví, kdo jste a jak časopis používáte, pouze Vám jej doručí, protože jste předplatitelem (volná spojka).
jak navrhnout Systém událostí?
mám scénu, ve které máme třetího hráče(řekněme pana X), bludiště a některé dveře. Nyní, řekněme Mr. X se chce dostat k východu z bludiště, ale mezi nimi jsou některé dveře, které lze otevřít, jakmile se k nim pan X přiblíží.
dveře mají spoušť box urychlovač, který spouští další urychlovač zapojených v této kolize.
implementujme to pomocí systému událostí.
začněme přidáním GameObject ve scéně a přidáním nového skriptu s názvem EventsManager.cs
naše první události budou ty, které budou střílet, když náš hráč vstoupí nebo opustí spouštěcí oblast dveří.
pro to, v EventsManager.cs class, vytvořit dvě akce události DoorTriggerEnter a DoorTriggerExit, také metody, které mohou vyvolat příslušnou akci události. Vytvořte také statický odkaz na singleton pro třídu.
Teď potřebujeme objekty, které mohou oheň a přihlásit se na tyto události. K tomu vytvořit dvě třídy, jeden pro dveře, DoorController.cs, a jeden pro spouštěcí oblast dveří, DoorTrigger.ČS.
v DoorController.cs, vytvořit dvě metody, které mohou poslouchat, když někdo vystřelí DoorTriggerEnter nebo DoorTriggerExit události a plnit své úkoly. V metodě Start DoorController přistupujte k událostem ze třídy EventsManager pomocí statické instance a přihlaste se k příslušné metodě.
Nyní, naše akce jsou připraveny a uživatelé jsou poslech na tyto události. Tak, ve třídě DoorTrigger, musíme tyto události vypálit metodou OnTriggerEnter.
Ok.. takže pojďme připojit DoorController a doortrigger skript na každé dveře a spouštěcí oblasti, respektive a hrát scénu.
Uhh Ohh! Je tu jeden problém…
Naše EventManager je singleton třídy a každé dveře, spoušť je vyvolání události a každé dveře regulátor je poslouchat a reagovat na stejnou událost. Při vyvolání události musíme předat nějaké jedinečné id, aby tuto událost poslouchaly pouze dveře, které mají stejné id.
v našem konkrétním případě jsou spouštěče a nadřazený objekt dveří stejné. Takže můžeme předat ID instance rodičovského gameobject.
Pojďme si hrát na scénu..
Pokracovani.. teď to funguje podle očekávání.
nezapomeňte tyto události odhlásit, protože vás mohou vést k nežádoucím chybám. Například pokud zničíte dveře za běhu atd.
tak můžeme vytvořit náš jednoduchý systém událostí.
to je prozatím vše… Šťastné Kódování! 🙂