Avant de sauter dans ce qu’est un système d’événements et comment le faire, discutons d’abord pourquoi est-il utile d’avoir un système d’événements?
Dans Unity, vous vous appuierez sur l’une des deux choses énumérées ci-dessous pour obtenir les données ou les dépendances d’une autre classe.
Vous
Regroupez vos propriétés publiques ou sérialisées dans un Monobehaviour pour pouvoir les affecter à partir de l’inspecteur pour obtenir les références.
Ou
Utilisez le modèle Singleton dans votre code pour obtenir les données dont vous avez besoin.
Si vous n’êtes pas déjà au courant du modèle de conception Singletons, il s’agit d’un modèle de conception logicielle qui limite l’instanciation d’une classe à une seule instance. Ceci est utile lorsqu’un seul objet est nécessaire pour coordonner les actions à travers le système.
Si un autre objet du code a besoin de données de cet objet, nous appelons l’instance singleton pour y faire référence. Les singletons sont très utiles pour se référer aux classes dont vous savez qu’elles n’auront besoin que d’une seule instance.
Quelle que soit l’approche que vous utilisez pour obtenir les dépendances, vous rencontrerez des problèmes lors de la modification d’une petite chose ou de la refactorisation du code, en particulier si vous travaillez sur un très grand projet.
Allégeons les dépendances!
Les systèmes d’événements aident à modulariser votre code en envoyant des messages entre des classes qui ne se connaissent pas directement. Ils permettent aux choses de répondre à un changement d’état sans le surveiller constamment dans une boucle de mise à jour. C’est une forme de modèle d’observateur dans lequel un objet, appelé le sujet, tient à jour une liste de ses personnes à charge, appelées observateurs, et les informe automatiquement de tout changement d’état, généralement en appelant leurs méthodes.
Comprenons cela par un exemple d’abonnement à un magazine.
- Un éditeur de magazines (sujet) est dans l’entreprise et publie des magazines (données).
- Si vous (utilisateur de data/observateur) êtes intéressé par le magazine auquel vous vous abonnez (inscrivez-vous), et si une nouvelle édition est publiée, elle vous est livrée.
- Si vous vous désabonnez (désinscrivez), vous ne recevez plus de nouvelles éditions.
- L’éditeur ne sait pas qui vous êtes et comment vous utilisez le magazine, il vous le livre simplement parce que vous êtes abonné (couplage lâche).
Comment concevoir le système d’événements?
J’ai une scène dans laquelle nous avons un joueur tiers contrôleur (disons M. X), un labyrinthe et quelques portes. Maintenant, disons Mr. X veut atteindre la sortie du labyrinthe mais il y a des portes entre les deux qui peuvent être ouvertes dès que M. X arrive près d’elles.
Les portes ont un collisionneur à boîte de déclenchement qui déclenche l’autre collisionneur impliqué dans cette collision.
Implémentons cela en utilisant un système d’événements.
Commençons par ajouter un GameObject dans la scène et ajouter un nouveau script appelé EventsManager.cs
Nos premiers événements seront ceux qui se déclencheront lorsque notre joueur entrera ou sortira de la zone de déclenchement de la porte.
Pour cela, Dans EventsManager.classe cs, créez deux actions d’événement DoorTriggerEnter et DoorTriggerExit, également des méthodes qui peuvent appeler l’action d’événement respective. Créez également une référence singleton statique pour la classe.
Maintenant, nous avons besoin d’objets qui peuvent se déclencher et s’abonner à ces événements. Pour cela, créez deux classes, une pour la porte, DoorController.cs, et un pour la zone de déclenchement de la porte, DoorTrigger.cs.
Dans le contrôleur de porte.cs, créez deux méthodes qui peuvent écouter lorsque quelqu’un déclenche des événements DoorTriggerEnter ou DoorTriggerExit et effectue ses tâches. Dans la méthode Start du DoorController, accédez aux événements de la classe EventsManager à l’aide de l’instance statique et abonnez-vous à sa méthode respective.
Maintenant, nos événements sont prêts et les abonnés écoutent ces événements. Donc, dans la classe DoorTrigger, nous avons juste besoin de déclencher ces événements dans la méthode OnTriggerEnter.
D’accord.. attachons donc le script DoorController et DoorTrigger à chaque zone de porte et de déclenchement respectivement et jouons la scène.
Ohh Ohh! Il y a un problème…
Notre EventManager est une classe singleton et chaque déclencheur de porte appelle l’événement et chaque contrôleur de porte écoute et répond à ce même événement. Nous devons passer un identifiant unique lors de l’appel de l’événement afin que seule la porte qui a le même identifiant écoute cet événement.
Dans notre cas particulier, les déclencheurs et l’objet parent de la porte sont les mêmes. Ainsi, nous pouvons transmettre l’id d’instance de l’objet gameobject du parent.
Jouons la scène..
Yeahhh.. cela fonctionne comme prévu maintenant.
Assurez-vous de vous désabonner de ces événements car ils peuvent vous conduire à des erreurs indésirables. Par exemple, si vous détruisez votre porte au moment de l’exécution, etc.
C’est ainsi que nous pouvons créer notre système d’événements simple.
C’est tout pour l’instant les gens… Bon Codage! 🙂