一直偷懒没有开发这个东西,最近要做新手引导系统,必须大范围的解耦,所以不得不用消息系统来管理了。上网查了几篇文章,发现一点也不难,但是可能有的教程比较老,或者格式比较乱,所以我重新来写一个我自己的实现吧,抛砖引玉。
这个管理器,包含几个部分:
事件类型的枚举
事件列表
监听器的添加和删除
事件发送
我假定读者尚不清楚事件管理器的概念。每当一个消息被触发的时候,在触发位置调用一下事件发送的函数。然后这个函数,会去事件列表中定位该事件,找出它对应的回调函数队列,逐个执行。如果没有回调函数,那么这个消息什么也不做。如果某个类需要监听某个事件,就将回调函数注册进去,如果不需要了,就从队列中删除。
这方面网上文章很多,就不详细介绍了,只说下基本思路。Delegate用来定义一种通用的函数类型,将函数作为参数传递,比如
public delegate void Func();
这里我定义了一个函数形式命名为Func,符合这个结构的,都可以当做这个delegate使用。需要传入函数作为参数的时候,这样用:
void Awake(){ Foo(Test); } public void Test(){ Debug.Log("hello"); } public void Foo(Func bar){ bar(); }
public enum CustomEventType{ //事件列表 } public delegate void EventCallback(object data = null); public class EventManager{ private static EventManager _instance; public static EventManager instance{ get{ if(_instance == null){ _instance = new EventManager(); } return _instance; } } private static Dictionary<CustomEventType, List<EventCallback>> eventQueue = new Dictionary<CustomEventType, List<EventCallback>>(); public static void AddListener(CustomEventType type, EventCallback callback){ if(!eventQueue.ContainsKey(type)){ eventQueue.Add(type, new List<EventCallback>()); } if(!eventQueue[type].Contains(callback)){ eventQueue[type].Add(callback); } } public static void RemoveListener(CustomEventType type, EventCallback callback){ if(eventQueue.ContainsKey(type)){ eventQueue[type].Remove(callback); } } public static void PostEvent(CustomEventType type){ if(eventQueue != null && eventQueue.ContainsKey(type)){ List<EventCallback> callbacks = eventQueue[type]; for (int i = 0; i < callbacks.Count; i++) { callbacks[i](); } } } }