using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class MessageCenter : MonoBehaviour {
// 一个Dictionary,用于存储不同类型的消息所对应的事件委托,每个消息类型都会有多个订阅者
private Dictionary<string, List<MessageHandler>> eventListeners = new Dictionary<string, List<MessageHandler>>();
// 消息处理程序的委托
public delegate void MessageHandler(object sender, Hashtable message);
// 向消息中心注册监听器
public void RegisterListener(string eventName, MessageHandler handler)
{
if(!eventListeners.ContainsKey(eventName)) { // 如果该事件没有任何订阅者
eventListeners.Add(eventName, new List<MessageHandler>()); // 在字典中创建一个新的键值对
}
List<MessageHandler> listenerList = eventListeners[eventName]; // 获取该事件对应的所有订阅者列表
if(!listenerList.Contains(handler)) { // 如果传入的处理程序还没有被注册
listenerList.Add(handler); // 将其添加至订阅列表中
}
}
// 从消息中心删除已注册的监听器
public void UnregisterListener(string eventName, MessageHandler handler)
{
if(eventListeners.ContainsKey(eventName)) { // 如果该事件存在订阅者
List<MessageHandler> listenerList = eventListeners[eventName];
if(listenerList.Contains(handler)) { // 如果传入的处理程序在订阅列表中
listenerList.Remove(handler); // 从列表中移除该处理程序
}
}
}
// 向消息中心广播事件
public void SendMessage(string eventName, Hashtable message)
{
if(eventListeners.ContainsKey(eventName)) { // 如果该事件有订阅者
List<MessageHandler> listenerList = eventListeners[eventName];
foreach(MessageHandler handler in listenerList) { // 遍历所有订阅此事件的处理程序
handler(this, message); // 调用消息处理委托
}
}
}
}
上述代码实现了一个基本的Unity消息中心,它允许您将不同的消息传递给不同的订阅者。在此代码中,我使用一个Dictionary来存储不同类型的消息所对应的事件委托,每个消息类型都可能有多个订阅者。
为了向消息中心注册监听器,可以使用RegisterListener方法。如果事件未被任何人订阅,则会为其创建一个新的键值对。
要从消息中心注销已注册的监听器,请使用UnregisterListener方法。
最后,要向消息中心广播事件并通知所有订阅此事件的处理程序,请使用SendMessage方法。
这种Unity消息中心非常灵活,可以轻松地扩展以满足您项目的特定需求。例如,您可能希望添加一些保护措施,例如只允许特定对象广播某些类型的消息。