一直偷懒没有开发这个东西,最近要做新手引导系统,必须大范围的解耦,所以不得不用消息系统来管理了。上网查了几篇文章,发现一点也不难,但是可能有的教程比较老,或者格式比较乱,所以我重新来写一个我自己的实现吧,抛砖引玉。

功能介绍

这个管理器,包含几个部分:

  1. 事件类型的枚举

  2. 事件列表

  3. 监听器的添加和删除

  4. 事件发送

原理简述

我假定读者尚不清楚事件管理器的概念。每当一个消息被触发的时候,在触发位置调用一下事件发送的函数。然后这个函数,会去事件列表中定位该事件,找出它对应的回调函数队列,逐个执行。如果没有回调函数,那么这个消息什么也不做。如果某个类需要监听某个事件,就将回调函数注册进去,如果不需要了,就从队列中删除。

关于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]();
            }
        }
    }

}

敲键盘的猫
772 声望131 粉丝

一只热爱科技的猫