BooMessenger

Author: Ofer Reichman (tortoise)

Description
BooMessenger is an efficient and simple to use messaging platform. It facilitates lightweight dispatching of messages (events) between script components without the need of coupling. It is written in Boo and can be used by any scripting language. Messages are properly defined so that errors are caught during compilation. Messages can also be grouped hierarchially using inheritance for easy subscription.

Creating and using the messenger
You don't need to create the messenger. It is created implicitly by the God class, which is bundled and implements the singleton pattern. To access the single messenger simply use:

The singleton mechanics were decoupled to provide a single place for all single instances. Tip: Feel free to use the God class as a container for any classes of yours of which you only need one instance.

Dispatching a message
To create and send a message simply instantiate a message class, provided with parameters, and voila! For example, if you have a message called MessageText you can write:

The message will be sent right away.

Listening to messages
You can subscribe to receive a message or a group of messages using the Listen function. It receives the message type and the listener, which is the component calling (self):

Note: The listening script must be attached to a game object. You can unsubscribe using the StopListening function. It receives the same parameters:

Any received message will be handled by a function named OnMsgName, where Name is the name of the message class, without the Message prefix:

Yes, naming is important. You should give all your message class names that start with Message. Listening to a group of messages will be explained later in the Grouping messages section.

Defining messages
Messages are defined by inheriting from the Message class:

You can define a message with additional properties by adding properties to your message class. For example, you might want to attach a string:

Make sure that the base class constructor is called last, since it actually sends the message. Tip: Create a folder for all of your message scripts to keep your workspace organized.

Grouping messages
You can group your messages hierarchially using multiple levels of inheritance. For example, you can have a group of messages that have something in common:

Inherit from it to create individual messages:

Easily subscribe to receive all of them:

In a similar fashion you can also listen to all messages by subscribing to the Message base class.

Performance
BooMessenger is quite efficient when it comes to speed. While it is not as fast as delegates, it is slightly faster than using SendMessage. The reason for this is that it does not iterate through all scripts attached to a game object. It keeps a direct reference to the listening script. Still, it should be used moderately. It is ill-advised to use it inside Update or FixedUpdate.

Integrating with JavaScript/C#
It is possible to use BooMessenger together with any JavaScript/C# scripts you may have. The topic of scripting languages interoperability is already covered by Unity in: Script compilation. Simply place all the Boo code inside the "Standard Assets" folder (for example under "Standard Assets/Scripts/Messenger") and leave the code that uses it outside.