rakennetaan mukautettu tapahtumajärjestelmä Unity3D: ssä

Akshay Arora
Akshay Arora

seuraa

Toukokuu 3, 2020 * 5 min lukea

ennen kuin hyppäät siihen, mikä on tapahtumajärjestelmä ja miten se tehdään, keskustellaan ensin siitä, miksi on hyödyllistä olla tapahtumajärjestelmä?

ykseydessä vedotaan jompaankumpaan alla luetelluista asioista saadakseen tiedot tai riippuvuudet toiselta luokalta.

joko

Niputat julkiset tai sarjakohtaiset kiinteistösi Yksiosaisiksi, jotta voit antaa ne tarkastajalta, jotta saat viitteet.

tai

käytä Singleton-kaavaa koodissasi saadaksesi tarvitsemasi tiedot.

jos ei ole jo tietoinen Singletonien suunnittelukuviosta, on kyseessä ohjelmistosuunnittelukuvio, joka rajoittaa luokan instantiaation yhteen yksittäiseen instanssiin. Tämä on hyödyllistä, kun tarvitaan täsmälleen yksi objekti koordinoimaan toimia koko järjestelmässä.

jos koodin toinen objekti tarvitsee tietoa kyseisestä objektista, kutsumme Singletonin instanssia viittaamaan siihen. Singletons ovat erittäin hyödyllisiä viitata luokkiin, jotka tiedät tarvitsevat vain yksi esimerkki siitä.

riippumatta siitä, mitä lähestymistapaa käytät riippuvuuksien saamiseksi, kohtaat ongelmia säätäessäsi pientä asiaa tai muokatessasi koodia uudelleen, varsinkin jos työskentelet hyvin suuren projektin parissa.

lievennetään riippuvuuksia!

Tapahtumajärjestelmät auttavat modularisoimaan koodin lähettämällä viestejä luokkien välillä, jotka eivät suoraan tiedä toisistaan. Niiden avulla asiat voivat reagoida tilan muutokseen ilman, että sitä seurataan jatkuvasti päivityssilmukassa. Se on Havaitsijakaavan muoto,jossa objekti, jota kutsutaan subjektiksi, ylläpitää luetteloa riippuvaisistaan, kutsuu tarkkailijoita ja ilmoittaa heille automaattisesti kaikista tilan muutoksista, yleensä kutsumalla heidän menetelmiään.

ymmärretään tämä esimerkiksi lehtitilauksella.

  • alalla toimii aikakauslehtien Kustantaja(subjekti), joka julkaisee lehtiä (data).
  • jos (tietojen käyttäjä/tarkkailija) on kiinnostunut tilaamastasi lehdestä(Rekisteröidy), ja jos uusi painos julkaistaan, se toimitetaan sinulle.
  • Jos peruutat tilauksen (perut rekisteröitymisen), et saa uusia painoksia.
  • kustantaja ei tiedä kuka olet ja miten käytät lehteä, se vain toimittaa sen sinulle, koska olet tilaaja(löysä kytkentä).

miten tapahtumajärjestelmä suunnitellaan?

minulla on kohtaus, jossa meillä on kolmannen Persoonanohjaaja(vaikkapa Herra X), sokkelo ja joitakin ovia. Sanotaan vaikka Herra. X haluaa päästä sokkelon uloskäynnille, mutta välissä on joitakin ovia, jotka voi avata heti, kun Herra X pääsee lähelle niitä.

ovissa on liipaisinlaatikon törmytin, joka laukaisee toisen törmäyksessä mukana olleen törmääjän.

toteutetaan tämä tapahtumajärjestelmällä.

aloitetaan lisäämällä kohtaukseen GameObject ja lisäämällä uusi skripti nimeltä EventsManager.cs

ensimmäiset tapahtumamme ovat ne, jotka ampuvat, kun pelaajamme tulee tai poistuu oven laukaisualueelta.

sille, Eventsmanagerissa.cs-Luokka, luo kaksi tapahtumatoimintaa DoorTriggerEnter ja DoorTriggerExit, myös menetelmiä, jotka voivat vedota vastaavaan tapahtumatoimintaan. Myös, luoda staattinen singleton viittaus luokan.

tarvitsemme esineitä, joilla voi ampua ja tilata näitä tapahtumia. Sillä luoda kaksi luokkaa, yksi ovi, Ovenvalvoja.cs, ja yksi oven laukaisualueelle, DoorTrigger.cs.

Ovikellossa.CS, luoda kaksi menetelmää, jotka voivat kuunnella, kun joku tulipalot DoorTriggerEnter tai DoorTriggerExit tapahtumia ja suorittaa tehtävänsä. Vuonna Start menetelmä DoorController, käyttää tapahtumia EventsManager luokan käyttämällä staattinen instanssi, ja tilata sen vastaavan menetelmän.

nyt meidän tapahtumat ovat valmiina ja tilaajat kuuntelevat näitä tapahtumia. DoorTrigger-luokassa täytyy ampua tapahtumat OnTriggerEnter-menetelmällä.

selvä.. joten liitetään DoorController ja DoorTrigger script kunkin oven ja laukaista alue vastaavasti ja pelata kohtaus.

Uhh Ohh! On yksi ongelma…

Eventmanagerimme on singleton-luokka ja jokainen ovilaukaisin vetoaa tapahtumaan ja jokainen oviohjain kuuntelee ja vastaa samaan tapahtumaan. Meidän on läpäistävä joku yksilöivä tunnus samalla kun vetoamme tapahtumaan, jotta vain ovi, jolla on sama tunnus, kuuntelee kyseistä tapahtumaa.
meidän tapauksessamme laukaisimet ja oven emäobjekti ovat samat. Niin, voimme siirtää esimerkiksi id vanhemman gameobject.

näytellään kohtaus..

Kyllä.. se toimii nyt odotetusti.

varmista, että peruutat nämä tapahtumat, sillä ne saattavat johtaa joihinkin ei-toivottuihin virheisiin. Esimerkiksi, jos tuhoat oven runtime, jne.

näin voimme tehdä yksinkertaisen tapahtumasysteemimme.

That ’ s all for now folks… Hyvää Koodausta! 🙂

You might also like

Vastaa

Sähköpostiosoitettasi ei julkaista.