costruiamo un Evento Personalizzato Sistema di Unity3D

Akshay Arora
Akshay Arora

Seguire

3 Maggio 2020 · 5 min a leggere

Prima di addentrarci in quello che è un evento di sistema, e come farlo, prendiamo in esame perché è utile avere un sistema di eventi?

In Unity, ti baserai su una delle due cose elencate di seguito per ottenere i dati o le dipendenze da un’altra classe.

Puoi

Raggruppare le tue proprietà pubbliche o serializzate in un Monobehaviour per poterlo assegnare dall’ispettore per ottenere i riferimenti.

O

Utilizzare il modello Singleton nel codice per ottenere i dati necessari.

Se non si è già a conoscenza del modello di progettazione Singleton, si tratta di un modello di progettazione software che limita l’istanziazione di una classe a una singola istanza. Ciò è utile quando è necessario esattamente un oggetto per coordinare le azioni in tutto il sistema.

Se un altro oggetto nel codice ha bisogno di dati da quell’oggetto, chiamiamo l’istanza singleton per fare riferimento ad esso. I singleton sono molto utili per fare riferimento alle classi che sai avranno bisogno di una sola istanza di esso.

Indipendentemente dall’approccio che usi per ottenere le dipendenze, dovrai affrontare problemi quando modifichi una piccola cosa o refactoring del codice, specialmente se lavori su un progetto molto grande.

Alleviamo le dipendenze!

I sistemi di eventi aiutano a modulare il codice inviando messaggi tra classi che non si conoscono direttamente l’una dell’altra. Consentono alle cose di rispondere a un cambiamento in uno stato senza monitorarlo costantemente in un ciclo di aggiornamento. È una forma di modello di osservatore in cui un oggetto, chiamato soggetto, mantiene un elenco dei suoi dipendenti, chiamati osservatori, e li notifica automaticamente di eventuali modifiche di stato, di solito chiamando i loro metodi.

Capiamo questo con un esempio di abbonamento a una rivista.

  • Un editore di riviste(soggetto) è nel business e pubblica riviste (dati).
  • Se tu (utente di dati / osservatore) sei interessato alla rivista ti iscrivi(registrati), e se viene pubblicata una nuova edizione ti viene consegnata.
  • Se disiscrivi (annulla la registrazione) smetti di ricevere nuove edizioni.
  • L’editore non sa chi sei e come usi la rivista, te la consegna solo perché sei un abbonato (accoppiamento sciolto).

Come progettare il sistema di eventi?

Ho una scena in cui abbiamo un lettore ThirdPersonController(ad esempio Mr. X), un labirinto e alcune porte. Ora, diciamo che il sig. X vuole raggiungere l’uscita del labirinto, ma ci sono alcune porte in mezzo che possono essere aperte non appena il signor X raggiunge vicino a loro.

Le porte hanno trigger box collider che innesca l’altro collisore coinvolto in questa collisione.

Implementiamo questo utilizzando un sistema di eventi.

Iniziamo aggiungendo un GameObject nella scena e aggiungendo un nuovo script chiamato EventsManager.cs

I nostri primi eventi saranno quelli che spareranno quando il nostro giocatore entra o esce dall’area del grilletto della porta.

Per questo, In EventsManager.classe cs, creare due azioni evento DoorTriggerEnter e DoorTriggerExit, anche, metodi che possono richiamare la rispettiva azione evento. Inoltre, creare un riferimento singleton statico per la classe.

Ora, abbiamo bisogno di oggetti che possano sparare e sottoscrivere questi eventi. Per questo crea due classi, una per la porta, DoorController.cs, e uno per l’area di innesco della porta, DoorTrigger.cs.

Nel DoorController.cs, creare due metodi che possono ascoltare quando qualcuno spara DoorTriggerEnter o DoorTriggerExit eventi ed eseguire i loro compiti. Nel metodo Start di DoorController, accedere agli eventi dalla classe EventsManager utilizzando l’istanza statica e sottoscrivere il rispettivo metodo.

Ora, i nostri eventi sono pronti e gli abbonati stanno ascoltando questi eventi. Quindi, nella classe DoorTrigger, abbiamo solo bisogno di attivare quegli eventi nel metodo OnTriggerEnter.

Ok.. quindi colleghiamo lo script DoorController e DoorTrigger a ciascuna porta e area di trigger rispettivamente e riproduciamo la scena.

Uhh Ohh! C’e ‘ un problema…

Il nostro EventManager è una classe singleton e ogni trigger porta richiama l’evento e ogni controller porta sta ascoltando e rispondendo a quello stesso evento. Dobbiamo passare un id univoco mentre invochiamo l’evento in modo che solo la porta che ha lo stesso id ascolterà quell’evento.
Nel nostro caso particolare, i trigger e l’oggetto genitore della porta sono gli stessi. Quindi, possiamo passare l’ID dell’istanza del gameobject del genitore.

Riproduciamo la scena..

Yeahhh.. sta funzionando come previsto ora.

Assicurati di annullare l’iscrizione a questi eventi in quanto potrebbero portare ad alcuni errori indesiderati. Ad esempio, se distruggi la tua porta in fase di esecuzione, ecc.

Quindi, è così che possiamo rendere il nostro semplice sistema di eventi.

Questo è tutto per ora gente… Codifica felice! 🙂

You might also like

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.