i think i got this working, if anyone cares:
using System.Collections;
using UnityEngine;
public class MessageDispatcher : MonoBehaviour
{
private static MessageDispatcher instance;
public MessageDispatcher ()
{
if (instance != null)
{
return;
}
instance = this;
}
public static MessageDispatcher Instance
{
get
{
if (instance == null)
{
new MessageDispatcher();
}
return instance;
}
}
readonly Hashtable messages = new Hashtable();
public void AddObserver (GameObject observer, string name)
{
AddObserver(observer, name, null);
}
public static void AddObserver_ (GameObject observer, string name)
{
instance.AddObserver(observer, name, null);
}
public void AddObserver (GameObject observer, string name, GameObject sender)
{
if (name == null)
{
Debug.Log("Null name specified for notification in AddObserver.");
return;
}
if (!messages.Contains(name))
{
Debug.Log("AddObserver");
messages[name] = new ArrayList();
}
ArrayList notifyList = (ArrayList) messages[name];
if (!notifyList.Contains(observer))
{
notifyList.Add(observer);
}
}
public static void AddObserver_ (GameObject observer, string name, GameObject sender)
{
if (name == null)
{
Debug.Log("Null name specified for notification in AddObserver.");
return;
}
if (!instance.messages.Contains(name))
{
Debug.Log("AddObserver");
instance.messages[name] = new ArrayList();
}
ArrayList notifyList = (ArrayList) instance.messages[name];
if (!notifyList.Contains(observer))
{
notifyList.Add(observer);
}
}
public void RemoveObserver (GameObject observer, string name)
{
ArrayList notifyList = (ArrayList) messages[name];
if (notifyList != null)
{
if (notifyList.Contains(observer))
{
notifyList.Remove(observer);
}
if (notifyList.Count == 0)
{
messages.Remove(name);
}
Debug.Log("RemoveObserver");
}
}
public static void RemoveObserver_ (GameObject observer, string name)
{
ArrayList notifyList = (ArrayList) instance.messages[name];
if (notifyList != null)
{
if (notifyList.Contains(observer))
{
notifyList.Remove(observer);
}
if (notifyList.Count == 0)
{
instance.messages.Remove(name);
}
Debug.Log("RemoveObserver");
}
}
public void PostMessage (GameObject aSender, string aName)
{
PostMessage(aSender, aName, null);
}
public static void PostMessage_ (GameObject aSender, string aName)
{
instance.PostMessage(aSender, aName, null);
}
public void PostMessage (GameObject aSender, string aName, GameObject aData)
{
PostMessage(new Message(aSender, aName, aData));
}
public static void PostMessage_ (GameObject aSender, string aName, GameObject aData)
{
instance.PostMessage(new Message(aSender, aName, aData));
}
public void PostMessage (Message aMessage)
{
if (aMessage.name == null )
{
Debug.Log("Null name sent to PostMessage.");
return;
}
ArrayList notifyList = (ArrayList) messages[aMessage.name];
if (notifyList == null)
{
Debug.Log("Notify list not found in PostMessage.");
return;
}
ArrayList observersToRemove = new ArrayList();
foreach (GameObject observer in notifyList)
{
if (!observer)
{
observersToRemove.Add(observer);
}
else
{
observer.SendMessage(aMessage.name, aMessage, SendMessageOptions.DontRequireReceiver);
}
}
foreach (GameObject observer in observersToRemove)
{
notifyList.Remove(observer);
}
}
public static void PostMessage_ (Message aMessage)
{
if (aMessage.name == null )
{
Debug.Log("Null name sent to PostMessage.");
return;
}
ArrayList notifyList = (ArrayList) instance.messages[aMessage.name];
if (notifyList == null)
{
Debug.Log("Notify list not found in PostMessage.");
return;
}
ArrayList observersToRemove = new ArrayList();
foreach (GameObject observer in notifyList)
{
if (!observer)
{
observersToRemove.Add(observer);
}
else
{
observer.SendMessage(aMessage.name, aMessage, SendMessageOptions.DontRequireReceiver);
}
}
foreach (GameObject observer in observersToRemove)
{
notifyList.Remove(observer);
}
}
}
public class Message
{
public readonly GameObject sender;
public string name;
public readonly GameObject data;
public Message (GameObject aSender, string aName)
{
sender = aSender;
name = aName;
data = null;
}
public Message (GameObject aSender, string aName, GameObject aData)
{
sender = aSender;
name = aName;
data = aData;
}
#region Getters
public GameObject Data
{
get { return data; }
}
public GameObject Sender
{
get { return sender; }
}
#endregion
}
pretty messy-looking, but it seems to work. you can just call like this:
MessageDispatcher.AddObserver_(this.gameObject, "OnBumperCollision");
there was also a slight error in the logic of duke’s conversion that lead to some pretty loopy behavior that i fixed. i know that underscore almost certainly isn’t acceptable convention but it was the fastest way to get it working. is there a standard naming convention for a situation like this? i’ll change it if there is.