public class MsgDispatcher
{
private static Dictionary<string, Action<object>> MsgsDic = new Dictionary<string, Action<object>>();
/// <summary>
/// 注册消息
/// </summary>
public static void Register(string msgName,Action<object> onMsgReceived)
{
if (!MsgsDic.ContainsKey(msgName)){
MsgsDic.Add(msgName, _ => { });
}
MsgsDic[msgName] += onMsgReceived;
}
/// <summary>
/// 取消注册
/// </summary>
public static void UnRegisterAll(string msgName)
{
if (MsgsDic.ContainsKey(msgName))
{
MsgsDic.Remove(msgName);
}
}
/// <summary>
/// 取消注册
/// </summary>
public static void UnRegister(string msgName,Action<object> onMsgReceived)
{
if (MsgsDic.ContainsKey(msgName))
{
try
{
MsgsDic[msgName] -= onMsgReceived;
}catch(Exception e)
{
Debug.Log(e);
}
}
}
/// <summary>
/// 发送消息
/// </summary>
public static void SendMsg(string msgName,object data)
{
if (MsgsDic.ContainsKey(msgName))
{
MsgsDic[msgName](data);
}
}
}
消息机制, 可集成到MonoBehavior
#region 消息机制
//存储已经注册的消息
List<MsgRecord> MsgsRecords = new List<MsgRecord>();
#region 封装消息和消息处理函数
private class MsgRecord
{
public string Name;
public Action<object> OnMsgReceived;
static Stack<MsgRecord> MsgRecordPool = new Stack<MsgRecord>(); //对象池
//分配对象
public static MsgRecord Sprawn(string name, Action<object> cb)
{
MsgRecord record = null;
if (MsgRecordPool.Count > 0)
{
record = MsgRecordPool.Pop();
}
else
{
record = new MsgRecord();
}
record.Name = name;
record.OnMsgReceived = cb;
return record;
}
//回收对象
public void UnSprawn()
{
Name = string.Empty;
OnMsgReceived = null;
MsgRecordPool.Push(this);
}
}
#endregion
/// <summary>
/// 注册消息
/// </summary>
protected void RegisterMsg(string msgName, Action<object> OnMsgReceived)
{
MsgDispatcher.Register(msgName, OnMsgReceived);
MsgsRecords.Add(MsgRecord.Sprawn(msgName, OnMsgReceived));
}
/// <summary>
/// 注销消息
/// </summary>
protected void UnRegisterMsg(string msgName)
{
var recordList = MsgsRecords.FindAll(item => item.Name == msgName);
recordList.ForEach(item => {
MsgDispatcher.UnRegister(item.Name, item.OnMsgReceived);
MsgsRecords.Remove(item);
});
recordList.Clear();
}
/// <summary>
/// 注销消息
/// </summary>
protected void UnRegisterMsg(string msgName, Action<object> onMsgReceived)
{
var recordList = MsgsRecords.FindAll(item => item.Name == msgName && item.OnMsgReceived == onMsgReceived);
recordList.ForEach(item => {
MsgDispatcher.UnRegister(item.Name, item.OnMsgReceived);
MsgsRecords.Remove(item);
});
recordList.Clear();
}
/// <summary>
/// 发送消息
/// </summary>
protected void SendMsg(string msgName,object data)
{
MsgDispatcher.SendMsg(msgName, data);
}
protected abstract void OnBeforeDestroy();
private void OnDestroy()
{
OnBeforeDestroy();
//取消注册
foreach (var Item in MsgsRecords)
{
MsgDispatcher.UnRegister(Item.Name, Item.OnMsgReceived);
Item.UnSprawn();
}
MsgsRecords.Clear();
}
#endregion