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.

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!


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!

 

11 réponses

  1. I will right away clutch your rss feed as I can’t in finding your e-mail subscription link or newsletter service.
    Do you’ve any? Please permit me recognize in order that I may just subscribe.
    Thanks.

  2. Bonjour,

    Je vous écris aujourd’hui pour vous parler d’une nouvelle astuce.

    Que diriez vous d’obtenir des sous en crypto à chaque fois que vous faites une recherche sur internet ?

    On crée son compte, on cherche et on obtient des cryptos PRE ! On peut pas plus facile !

    Essayez par vous même, ça s’appelle Presearch : https://bit.ly/presearch_crypto

    Il suffit de cliquer sur “register” en haut à droite, et de créer son compte, et vous pouvez faire vos recherches immédiatement.

    Contente de vous lire en retour

    Marielle

  3. My partner and I stumbled over here different web address and thought I should check things
    out. I like what I see so i am just following you. Look forward to looking at
    your web page again.

  4. Its such as you learn my thoughts! You appear to grasp a
    lot about this, such as you wrote the book in it or something.
    I think that you could do with a few p.c. to pressure the message house a little
    bit, however instead of that, this is wonderful blog.
    A fantastic read. I’ll certainly be back.

  5. Good day! This is kind of off topic but I need
    some help from an established blog. Is it difficult to
    set up your own blog? I’m not very techincal but I can figure things out pretty quick.
    I’m thinking about making my own but I’m not sure where
    to begin. Do you have any tips or suggestions? With thanks

  6. I’ve been surfing on-line greater than 3 hours as of
    late, but I by no means found any fascinating article like yours.
    It’s lovely value sufficient for me. Personally, if all website
    owners and bloggers made just right content as you did,
    the net shall be much more helpful than ever before.

  7. I really like your blog.. very nice colors & theme.

    Did you make this website yourself or did you hire someone to do it for you?
    Plz reply as I’m looking to create my own blog and would like to find
    out where u got this from. many thanks

    my web site; Joker123

  8. Greetings from California! I’m bored to death at work so I decided to
    check out your site on my iphone during lunch break. I love the
    info you present here and can’t wait to take a look when I get home.

    I’m amazed at how fast your blog loaded on my mobile ..
    I’m not even using WIFI, just 3G .. Anyhow, awesome blog!

  9. ไม่ต้องสงสัยเลย ไม่มี
    โฆษณา มี ไม่มีอะไรเลย ที่จะบล็อก ภาพ.
    ดู ภาพยนตร์ ถึงอย่างเต็มที่ ส่วนใหญ่เป็นเพราะ นี่คือ
    อินเทอร์เน็ต ดู วิดีโอ ทางอินเทอร์เน็ต.NET เต็ม ยอดเยี่ยม ภาพยนตร์ , เลือกแล้ว ภาพยนตร์
    คุณภาพสูง เกี่ยวกับ ภาษา ภาพถ่าย
    และ เสียง สูง-qu ality, บวก สี ของ ภาพ อนุญาต ผู้ชม ดู ตวัด บนเว็บใน อันทั้งหมด-ไฮไลต์ วิธี 5.หนึ่ง เพลงประกอบภาพยนตร์จาก ภาพเคลื่อนไหว ไฟล์ของ เวิลด์ไวด์เว็บ , สังเกต ภาพยนตร์ ทางเน็ต , เน็ต ซึ่งรวมถึง คอลเลกชัน , การ์ตูน, ต่างประเทศ ตวัด,ไทย ภาพยนตร์,ฯลฯ.
    ในฮอลลีวูด ตวัด. ซึ่งรวมถึง สวย มีทักษะ นักแสดง และด้วย theผู้ดู ใคร FC หรือ ภาพยนตร์ admirers,
    let me แจ้งให้คุณทราบ, คุณไม่ควร ข้าม มัน อีกต่อไป.

    และ ยิ่งกว่านั้น ผู้ชมสามารถ มองไปข้างหน้าถึง ฟรีทั้งหมด , โดยไม่คำนึงถึง ซึ่ง เรื่องราว บันทึก ดอลลาร์ แทบไม่มีอะไรเลย จ่าย ฟรี ดูตลอด ดูหนังออนไลน์ เว็บไซต์นี้ อันไหน ออนไลน์ ภาพเคลื่อนไหว เว็บไซต์ สามารถสร้าง ทุกคน ชื่นชมยินดีและ เว็บไซต์คือ เว็บไซต์ ที่อาจ เข้าถึง ทันที , ภาพยนตร์ ข้อมูล ปกติไม่ใช่กระตุก สร้าง อารมณ์ กับ ภาพยนตร์ แม้ตอนนี้ ปกติ, หรือไม่ เห็น
    เก่า ภาพยนตร์ ใหม่ ภาพเคลื่อนไหว , คุณภาพ {ยังคง | ยังคงเป็น | ยังคงอยู่

Laisser un commentaire

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

Résoudre : *
20 − 4 =