Utiliser des événements pour communiquer

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Le principe de base d’un jeu vidéo, c’est l’interaction. Le joueur interagit avec le jeu qui lui répond à son tour. Mais les éléments du jeu interagissent entre eux également ! Il y a différentes façons de les faire communiquer, l’une d’entre elles est d’utiliser des événements.

Les événements c’est quoi ?

Pour faire communiquer des éléments de votre jeu dans Unity 3D, vous avez plusieurs possibilités :

  1. Forte adhérence : chaque GameObject conserve chez lui un lien vers tous les autres éléments avec lesquels il va interagir.
  2. Forte indépendance : aucun lien entre les différents GameObjects, ils communiquent entre eux par événements.

Dans le cas d’une adhérence forte, chaque GameObject a un lien vers chacun des éléments avec qui il va interagir :

Fonctionnement classique avec une forte adhérence

Si vous beaucoup d’éléments doivent interagir les uns avec les autres, vous allez passer beaucoup de temps à écrire du code et paramétrer quel GameObject doit aller où, et communiquer avec qui. Dans le cas où certains de vos GameObjects sont générés à la volée, ça complique encore la chose. On va pas se mentir, ça peut vite devenir un joyeux bordel impossible à maintenir…

En utilisant le concept de la communication événementielle, vous pouvez entièrement découpler les GameObjects les uns des autres :

Fonctionnement de communication basé sur des événements

Ici, les GameObjects n’ont pas de liens directs entre eux. Ils envoient des événements pour notifier d’une action : « il s’est passé ça ». De leur côté, chaque GameObject va écouter un type d’événement. Dès lors, le gestionnaire d’événements va envoyer l’information aux GameObjects concernés.

Pour imager, c’est comme votre compte Twitter :

  • Vous écrivez sur votre fil sans avoir de destinataire particulier : envoi d’un événement « publication ».
  • Des gens peuvent sous suivre (abonnement) et voir vos messages (écouter votre événement « publication »). Notez que vous pouvez publier sans que personne ne vous suive, ça fonctionne quand même (je ne vous le souhaite pas !).
  • Lorsque vous publiez, les personnes abonnées à votre flux reçoivent la publication (réception de l’événement « publication »)

Fonctionnement dans Unity

Unity propose un système intégré qui s’approche de la communication événementielle. Pour situer, c’est entre les deux points vu précédemment. Ce n’est pas un maillage en dur, mais pas totalement de l’événementiel non plus. Voyons voir tout ça.

Unity intègre un système de « messages ». Vous pouvez envoyer des messages dans la hiérarchie du GameObject via les méthodes suivantes :

SendMessage("maMethode");
SendMessageUpwards("maMethode");

Le fonctionnement est relativement simple. Lorsque vous appelez une de ces méthodes, le moteur d’Unity 3D va parcourir la hiérarchie et chercher une méthode ayant le même nom dans tous les composants qu’il trouvera. S’il trouve une méthode correspondante, il l’appellera :

Fonctionnement des méthodes SendMessage et SendMessageUpwards

  • SendMessage envoie le message vers les enfants
  • SendMessageUpward envoie le message vers les parents

Notez un point intéressant : si vous appelez ces méthodes via une variable du type GameObject, le message sera transmis en fonction de sa hiérarchie et non celle du GameObject auquel est attaché le script.

Fonctionnement avancé

Nous avons vu qu’Unity 3D proposait une approche par messages dans la hiérarchie. Cela implique que l’on ne peut envoyer des messages qu’à des composants attachés à des GameObjects. Il est cependant possible de s’affranchir entièrement de cet aspect avec de l’événementiel pur et dur :

  • « Quelque chose » envoie un événement
  • « Quelque chose » d’autre écoute cet événement et exécute une action en réaction

Nous allons voir ici comment utiliser eDriven qui est un Asset permettant de gérer simplement la mise en place d’un fonctionnement événementiel. Cet Asset est disponible sur l’Asset Store ici.

Pour l’utiliser, il nous faut tout d’abord créer le gestionnaire d’événements. Ce gestionnaire doit absolument être unique et tous les événements devront passer par lui. Il est très important de ne pas créer plusieurs gestionnaires d’événements. Pour se faire, on va créer un script à attacher sur un GameObject qui stockera notre gestionnaire :

public class EventManager : MonoBehaviour
{
    public EventDispatcher Dispatcher = new EventDispatcher();
}

Le gestionnaire est en place, voyons maintenant comment envoyer un événement (ici au clic de la souris) :

public class EventSender : MonoBehaviour
{
    private void OnMouseDown()
    {
        var manager = GameObject.FindObjectOfType<EventManager>().Dispatcher;
        manager.DispatchEvent(new eDriven.Core.Events.Event("MonEvenement"));
    }
}

On commence par récupérer le gestionnaire d’événements. Ensuite on utilise DispatchEvent pour envoyer l’événement. Notez que l’événement est un objet de type eDriven.Core.Events.Event . Attention de bien utiliser ce namespace, Unity 3D contient également une classe  Event, mais ce n’est pas celle là qu’il faut utiliser. Ici, on envoie l’événement « MonEvenement ».

La dernière étape est de créer un script qui va écouter cet événement :

public class EventReceiver : MonoBehaviour
{
    private void Start()
    {
        var manager = GameObject.FindObjectOfType<EventManager>().Dispatcher;
        manager.AddEventListener("MonEvenement", HandleMyEvent);
    }

    public void HandleMyEvent(eDriven.Core.Events.Event e)
    {
        print("coucou");
    }
}

Le fonctionnement est légèrement différent. Il faut commencer par déclarer que l’on veut écouter un certain événement. C’est ce qui est fait dans la méthode Start. Si vous ne déclarez pas le Listener, l’événement ne sera pas écouté ! Ensuite, il faut créer une méthode qui va exécuter un traitement voulu lorsque l’événement est reçu.

L’envoyeur de l’événement est alors entièrement découplé du receveur. Voir des receveurs. Car en effet, plusieurs scripts peuvent écouter un même événement !

Intérêt d'une communication par événements

Si la première méthode est plus simple et plus rapide à mettre en place, la seconde propose un découplage total et une meilleure liberté.

Cet article vous a appris quelque chose ? N’hésitez pas et partagez le via les boutons ci dessous.


  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *