Laten we het Bouwen van een Aangepaste Gebeurtenis Systeem in Unity3D

Akshay Arora
Akshay Arora

Volg

Mei 3, 2020 · 5 min te lezen

Voordat springen in wat is een evenement systeem en hoe om het te maken, laten we eerst bespreken waarom is het nuttig te beschikken over een evenement systeem?

in Unity, zult u vertrouwen op een van de twee dingen hieronder om de gegevens of afhankelijkheden van een andere klasse te krijgen.

u of

bundelt uw publieke of seriële eigenschappen in een mono gedrag om het van de inspecteur te kunnen toewijzen om de referenties te krijgen.

of

gebruik het Singleton-patroon in uw code om de gegevens te verkrijgen die u nodig hebt.

Als u nog niet op de hoogte bent van het Singletons-ontwerppatroon, is het een software-ontwerppatroon dat de instantiatie van een klasse beperkt tot één enkele instantie. Dit is handig wanneer er precies één object nodig is om acties over het systeem te coördineren.

als een ander object in de code gegevens van dat object nodig heeft, noemen we de Singleton instantie om ernaar te verwijzen. Singletons zijn erg handig om te verwijzen naar de klassen waarvan je weet dat ze slechts één instantie nodig hebben.

ongeacht welke aanpak u gebruikt om de afhankelijkheden te krijgen, zult u problemen ondervinden bij het aanpassen van een klein ding of het heractiveren van de code, vooral als u aan een zeer groot project werkt.

laten we de afhankelijkheden verlichten!

Event systems helpen bij het modulariseren van uw code door berichten te verzenden tussen klassen die niet direct over elkaar weten. Ze laten dingen om te reageren op een verandering in een toestand zonder voortdurend toezicht op het in een update loop. Het is een vorm van Waarnemingspatroon waarin een object, het subject genoemd, een lijst van zijn afhankelijke personen bijhoudt, waarnemers genoemd, en hen automatisch op de hoogte stelt van elke staatsverandering, meestal door hun methoden aan te roepen.

laten we dit begrijpen aan de hand van een voorbeeld van een abonnement op tijdschriften.

  • een uitgever van tijdschriften (onderwerp) is werkzaam en publiceert tijdschriften (gegevens).
  • als u(gebruiker van data/waarnemer) geïnteresseerd bent in het tijdschrift dat u inschrijft (registreer), en als een nieuwe editie wordt gepubliceerd, wordt deze aan u bezorgd.
  • als u zich afmeldt(afmelden) stopt u met het verkrijgen van nieuwe edities.
  • de uitgever weet niet wie u bent en hoe u het tijdschrift gebruikt, het levert het alleen aan u omdat u een abonnee bent(losse koppeling).

hoe het Gebeurtenissensysteem te ontwerpen?

ik heb een scène waarin we een derde Persoonsbeheer speler hebben (zeg Mr. X), een doolhof, en enkele deuren. Nu, laten we zeggen Mr. X wil de uitgang van het doolhof bereiken, maar er zijn enkele deuren tussen die geopend kunnen worden zodra Mr.X dicht bij hen komt.

de deuren hebben trigger box collider die de andere collider activeert die betrokken is bij deze botsing.

laten we dit implementeren met behulp van een event systeem.

laten we beginnen met het toevoegen van een GameObject in de scene en het toevoegen van een nieuw script genaamd EventsManager.cs

onze eerste gebeurtenissen zullen degene zijn die zullen vuren wanneer onze speler het triggergebied van de deur binnenkomt of verlaat.

hiervoor, in EventsManager.cs klasse, maak twee event acties DoorTriggerEnter en DoorTriggerExit, ook, methoden die de respectieve gebeurtenis actie kan oproepen. Maak ook een statische singleton referentie voor de klasse.

we hebben objecten nodig die kunnen vuren en zich kunnen abonneren op deze gebeurtenissen. Maak daarvoor twee klassen, een voor de deur, deurcontroller.cs, en een voor de deur ‘ s trigger gebied, DoorTrigger.cs.

In de deurcontroller.cs, maak twee methoden die kunnen luisteren wanneer iemand branden DoorTriggerEnter of doortriggerexit gebeurtenissen en het uitvoeren van hun taken. In de Start methode van de DoorController, toegang tot de gebeurtenissen uit de EventsManager klasse met behulp van de statische instantie, en abonneren op de respectieve methode.

nu, onze evenementen zijn klaar en abonnees luisteren naar deze gebeurtenissen. Dus, in de DoorTrigger klas, hoeven we alleen maar die gebeurtenissen af te vuren in de OnTriggerEnter methode.

Oké.. dus laten we doorcontroller en DoorTrigger script aan elke deur en trigger gebied respectievelijk en speel de scène.

Uhh Ohh! Er is één probleem…

onze EventManager is een singleton klasse en elke deur trigger roept het evenement en elke deur controller luistert en reageert op hetzelfde evenement. We moeten een uniek id doorgeven terwijl we het evenement aanroepen, zodat alleen de deur met dezelfde id naar dat evenement luistert.
in ons specifieke geval zijn triggers en het bovenliggende object van de deur hetzelfde. We kunnen dus de instantie-id van het gameobject van de ouder doorgeven.

laten we de scène spelen..

Jahhh.. het werkt nu zoals verwacht.

zorg ervoor dat u zich afmeldt voor deze gebeurtenissen omdat ze u kunnen leiden tot een aantal ongewenste fouten. Bijvoorbeeld, als u uw deur te vernietigen tijdens runtime, enz.

zo kunnen we ons eenvoudige gebeurtenissysteem maken.

dat is alles voor nu mensen… Veel Succes Met Programmeren! 🙂

You might also like

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.