Vertical

Utiliser les SendMessage pour appeler des méthodes distantes

La méthode SendMessage est surement l’une des plus utiles dans Unity. Elle permet depuis n’importe quel GameObject d’envoyer un message vers un autre GameObject afin d’appeler des méthodes distantes. Malgré son aspect pratique cette méthode est assez gourmande en ressources et il existe des méthodes de substitution plus complexes mais plus efficaces. Cet article s’adresse donc plutôt à des débutants qui ne maîtrisent pas forcément les delegates ou les évènements par exemple.

GameObject.SendMessage()

La méthode SendMessage() est disponible depuis n’importe quel GameObject et dispose de 3 arguments : (methodName : String, value : object = null, options : SendMessageOptions = SendMessageOptions.RequireReceiver).

  • methodName : Le nom de la méthode à appeler sur le GameObject. exemple : “displayText”.
Il est à noter que la méthode sera appelée sur l’ensemble des MonoBehaviours du GameObject. Ceci peut être très utile dans certains cas. Si par exemple vous avez un système de combat avec des objets qui s’infligent des dégâts on peut avoir une méthode damageReceived(int damage) sur chacun des MonoBehaviours de l’objet. Un script pourra s’occuper de faire baisser la vie du joueur, l’autre d’afficher les dégâts, un troisième de jouer une animation…
  • object : l’argument qui sera fourni à la méthode. exemple : 10, “coucou”…
cet argument sera envoyé en paramètre à toutes les méthodes appelées. Il est possible que la méthode ne présente aucun paramètre. Auquel cas il sera ignoré. Cet argument de type object permet donc d’utiliser n’importe quelle forme de paramètre. On peut donc fournir une HashTable si l’on a besoin de donner plusieurs arguments à sa méthode.
Cet argument est optionnel. Par défaut Unity affiche une erreur si aucun MonoBehaviour ne dispose de la méthode appelée. Il est possible de ne pas afficher d’erreur en utilisant DontRequireReceiver. Cela permet par exemple d’avoir des SendMessage génériques sans être sûr qu’ils soient forcément utilisés à chaque fois.

Variantes

Il existe 2 variantes au SendMessage classique :

Cette méthode présente aussi dans tous les GameObject fait exactement la même chose qu’un SendMessage mais en appelant en plus la méthode sur tous les parents du GameObject. Cela peut être utile si vous avez des scripts qui doivent réagir au même appel dans les ancêtres du GameObject principal. On peut par exemple penser à un GameObject qui contient le Player et qui a besoin de réagir aux mêmes genres d’appels (Plateau de jeu, managers…).
Cette méthode présente aussi dans tous les GameObject fait exactement la même chose qu’un SendMessage mais en appelant en plus la méthode sur tous les enfants du GameObject. Cela peut être utile si vous avez des scripts qui doivent réagir au même appel dans les descendants du GameObject principal. On peut par exemple penser à un GameObject contenu dans le Player et qui a besoin de réagir aux mêmes genres d’appels (model animé, arme, inventaire…).

Limitations et équivalences

La question de la performance des SendMessage a déjà été étudié dans quelques posts sur les forums Unity (ici ou par exemple).  Ce qu’il faut retenir c’est que l’usage des SendMessage n’est pas extrêmement lents mais simplement moins performant que toutes les autres manières d’appeler des méthodes distantes.

  • L’appel direct
La plus simple (et la plus rapide) manière de limiter les SendMessage est d’appeler directement la méthode sur le GameObject. On peut ainsi facilement remplacer un SendMessage de dégât par un gameObject.GetComponent().damageReceived(30); qui s’occupera ensuite d’appeler directement les méthodes sur les autres composants du même GameObject. Cette méthode est d’autant plus efficace que le GameObject cible est référencé directement dans la source de l’appel et qu’elle évite les GameObject.Find() qui sont eux aussi gourmands.
  • Delegate/Event
L’utilisation des événements présentent les mêmes avantages que les SendMessage (appeler une méthode sur un grand nombre de MonoBehaviour en même temps) mais en étant plus efficace en terme de performances. Je vous invite à consulter cet article pour la mise en oeuvre.
ARTICLE SIMILAIRE: iTween : La librairie indispensable !
VOUS CHERCHEZ UN PARTENAIRE POUR RÉALISER UN JEU VIDÉO ?   VOUS AVEZ UN PROJET D’APPLICATION LUDIQUE ?  CONTACTEZ-NOUS!


Laisser un commentaire

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