c# 消息处理中心
1.利用枚举enum,来处理程序里面的跨脚本消息调用,
using System;
using System.Collections;
using UnityEngine;
using System.Collections.Generic;
using System.Linq;
public delegate void Handler();
public delegate void Handler<T1>(T1 param1);
public delegate void Handler<T1, T2>(T1 param1, T2 param2);
public delegate void Handler<T1, T2, T3>(T1 param1, T2 param2, T3 param3);
public delegate bool LoopHandler();
public delegate bool LoopHandler<T1>(T1 param1);
public delegate bool LoopHandler<T1, T2>(T1 param1, T2 param2);
public delegate bool LoopHandler<T1, T2, T3>(T1 param1, T2 param2, T3 param3);
public class MessageCenter {
private static readonly Dictionary<EMessage, List<Delegate>> delegateList = new Dictionary<EMessage, List<Delegate>>();
/// <summary>
/// 发送消息
/// </summary>
/// <param name="msg"></param>
/// <param name="args"></param>
public static void PostMessage(EMessage msg, params object[] args) {
ClearEmpty();
if (delegateList.ContainsKey(msg)) {
List<Delegate> Delegate = delegateList[msg];
int num = Delegate.Count;
for (int i = 0; i < num; i++)
{
Delegate mDelegate = Delegate[i];
if (!GameObjectUtil.IsNullOrEmpty(mDelegate))
{
if (mDelegate.Method.GetParameters().Length == args.Length)
{
#if !UNITY_EDITOR
try{
#endif
mDelegate.DynamicInvoke(args);
#if !UNITY_EDITOR
} catch (Exception e) {
Debug.LogError(e.Message);
}
#endif
}
}
}
// delegateList[msg].ForEach(mDelegate =>
// {
// if (!GameObjectUtil.IsNullOrEmpty(mDelegate))
// {
// if (mDelegate.Method.GetParameters().Length == args.Length)
// {
//#if !UNITY_EDITOR
// try{
//#endif
// mDelegate.DynamicInvoke(args);
//#if !UNITY_EDITOR
// } catch (Exception e) {
// OutLog.LogError(e.Message, e.StackTrace);
// }
//#endif
// }
// }
// });
}
}
public static void AddMessage(EMessage msg, Handler del) { Add(msg, del); }
public static void AddMessage<T1>(EMessage msg, Handler<T1> del) { Add(msg, del); }
public static void AddMessage<T1, T2>(EMessage msg, Handler<T1, T2> del) { Add(msg, del); }
public static void AddMessage<T1, T2, T3>(EMessage msg, Handler<T1, T2, T3> del) { Add(msg, del); }
private static void Add(EMessage msg, Delegate messageDelegate) {
if (messageDelegate == null) {
return;
}
if (!delegateList.ContainsKey(msg)) {
delegateList.Add(msg, new List<Delegate>());
}
if (!delegateList[msg].Contains(messageDelegate)) {
delegateList[msg].Add(messageDelegate);
}
}
public static void RemoveMessage(EMessage msg, Handler del) { Remove(msg, del); }
public static void RemoveMessage<T1>(EMessage msg, Handler<T1> del) { Remove(msg, del); }
public static void RemoveMessage<T1, T2>(EMessage msg, Handler<T1, T2> del) { Remove(msg, del); }
public static void RemoveMessage<T1, T2, T3>(EMessage msg, Handler<T1, T2, T3> del) { Remove(msg, del); }
private static void Remove(EMessage msg, Delegate del) {
if (delegateList.ContainsKey(msg))
{
if (delegateList[msg].Count == 0)
{
delegateList.Remove(msg);
return;
}
delegateList[msg].Remove(del);
if (delegateList[msg].Count == 0)
{
delegateList.Remove(msg);
}
}
}
private static void ClearEmpty() {
delegateList.ForEach(keyValue => {
keyValue.Value.RemoveAll(del => GameObjectUtil.IsNullOrEmpty(del) || GameObjectUtil.IsNullOrEmpty(del.Target));
});
}
}
2.脚本里面的EMessage是一个枚举,来区分字典中不同的方法.