c# 消息处理中心

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是一个枚举,来区分字典中不同的方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值