转载

[原创]在Unity中实现一个简单的消息管理器

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

功能介绍

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

  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]();             }         }     }  }
原文  http://segmentfault.com/a/1190000004347909
正文到此结束
Loading...