一直偷懒没有开发这个东西,最近要做新手引导系统,必须大范围的解耦,所以不得不用消息系统来管理了。上网查了几篇文章,发现一点也不难,但是可能有的教程比较老,或者格式比较乱,所以我重新来写一个我自己的实现吧,抛砖引玉。
功能介绍
这个管理器,包含几个部分:
事件类型的枚举
事件列表
监听器的添加和删除
事件发送
原理简述
我假定读者尚不清楚事件管理器的概念。每当一个消息被触发的时候,在触发位置调用一下事件发送的函数。然后这个函数,会去事件列表中定位该事件,找出它对应的回调函数队列,逐个执行。如果没有回调函数,那么这个消息什么也不做。如果某个类需要监听某个事件,就将回调函数注册进去,如果不需要了,就从队列中删除。
关于delegate
这方面网上文章很多,就不详细介绍了,只说下基本思路。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]();
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。