using System; using System.Collections.Generic; using UnityEngine; namespace GameWorld { public class EventManager { public static bool RegisterEvent(string eventName, EventManager.FBEventHandler handler, EventManager.ListenerQueue queue = EventManager.ListenerQueue.Game) where TEventArgs : EventArgs { Dictionary> dictionary = (queue != EventManager.ListenerQueue.Game) ? EventManager.ToolsEventDelegates : EventManager.GameEventDelegates; if (!dictionary.ContainsKey(eventName)) { dictionary[eventName] = new List(); } dictionary[eventName].Add(handler); return true; } public static bool UnregisterEvent(string eventName, EventManager.FBEventHandler handler, EventManager.ListenerQueue queue = EventManager.ListenerQueue.Game) where TEventArgs : EventArgs { Dictionary> dictionary = (queue != EventManager.ListenerQueue.Game) ? EventManager.ToolsEventDelegates : EventManager.GameEventDelegates; if (!dictionary.ContainsKey(eventName)) { return false; } dictionary[eventName].Remove(handler); return true; } public static void PostEvent(string eventDefine, TSender sender, TEventArgs args) where TSender : class where TEventArgs : EventArgs { if (EventManager.HandlePostEvent(EventManager.ToolsEventDelegates, eventDefine, sender, args)) { EventManager.HandlePostEvent(EventManager.GameEventDelegates, eventDefine, sender, args); } } public static void PostEvent(string eventDefine, TSender sender) where TSender : class { EventManager.PostEvent(eventDefine, sender, EventArgs.Empty); } public static void PostEvent(string eventDefine) { EventManager.PostEvent(eventDefine, null); } private static bool HandlePostEvent(Dictionary> eventDelegates, string eventDefine, object sender, TEventArgs args) where TEventArgs : EventArgs { bool flag = true; if (eventDelegates.ContainsKey(eventDefine)) { List list = eventDelegates[eventDefine]; for (int i = 0; i < list.Count; i++) { object obj = list[i]; if (obj is EventManager.FBEventHandler) { flag &= (obj as EventManager.FBEventHandler)(eventDefine, sender, args); } else if (obj is EventManager.FBEventHandler) { flag &= (obj as EventManager.FBEventHandler)(eventDefine, sender, args); } else { UnityEngine.Debug.LogError(string.Concat(new object[] { eventDefine, "事件Args类型注册错误,应为", typeof(TEventArgs), "请检查是否写成了object\n技术支持麻烦联系凤翔,谢谢" })); } } } return flag; } private static readonly Dictionary> GameEventDelegates = new Dictionary>(); private static readonly Dictionary> ToolsEventDelegates = new Dictionary>(); public delegate bool FBEventHandler(string eventDefine, object sender, TEventArgs msg) where TEventArgs : EventArgs; public enum ListenerQueue { Game = 3, Tools = 6 } } }