using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace UniFramework.Event { public static class UniEvent { private class PostWrapper { public int PostFrame; public int EventID; public IEventMessage Message; public void OnRelease() { PostFrame = 0; EventID = 0; Message = null; } } private static bool _isInitialize = false; private static GameObject _driver = null; private static readonly Dictionary>> _listeners = new Dictionary>>(1000); private static readonly List _postingList = new List(1000); /// /// 初始化事件系统 /// public static void Initalize() { if (_isInitialize) throw new Exception($"{nameof(UniEvent)} is initialized !"); if (_isInitialize == false) { // 创建驱动器 _isInitialize = true; _driver = new UnityEngine.GameObject($"[{nameof(UniEvent)}]"); _driver.AddComponent(); UnityEngine.Object.DontDestroyOnLoad(_driver); UniLogger.Log($"{nameof(UniEvent)} initalize !"); } } /// /// 销毁事件系统 /// public static void Destroy() { if (_isInitialize) { ClearAll(); _isInitialize = false; if (_driver != null) GameObject.Destroy(_driver); UniLogger.Log($"{nameof(UniEvent)} destroy all !"); } } /// /// 更新事件系统 /// internal static void Update() { for (int i = _postingList.Count - 1; i >= 0; i--) { var wrapper = _postingList[i]; if (UnityEngine.Time.frameCount > wrapper.PostFrame) { SendMessage(wrapper.EventID, wrapper.Message); _postingList.RemoveAt(i); } } } /// /// 清空所有监听 /// public static void ClearAll() { foreach (int eventId in _listeners.Keys) { _listeners[eventId].Clear(); } _listeners.Clear(); _postingList.Clear(); } /// /// 添加监听 /// public static void AddListener(System.Action listener) where TEvent : IEventMessage { System.Type eventType = typeof(TEvent); int eventId = eventType.GetHashCode(); AddListener(eventId, listener); } /// /// 添加监听 /// public static void AddListener(System.Type eventType, System.Action listener) { int eventId = eventType.GetHashCode(); AddListener(eventId, listener); } /// /// 添加监听 /// public static void AddListener(int eventId, System.Action listener) { if (_listeners.ContainsKey(eventId) == false) _listeners.Add(eventId, new LinkedList>()); if (_listeners[eventId].Contains(listener) == false) _listeners[eventId].AddLast(listener); } /// /// 移除监听 /// public static void RemoveListener(System.Action listener) where TEvent : IEventMessage { System.Type eventType = typeof(TEvent); int eventId = eventType.GetHashCode(); RemoveListener(eventId, listener); } /// /// 移除监听 /// public static void RemoveListener(System.Type eventType, System.Action listener) { int eventId = eventType.GetHashCode(); RemoveListener(eventId, listener); } /// /// 移除监听 /// public static void RemoveListener(int eventId, System.Action listener) { if (_listeners.ContainsKey(eventId)) { if (_listeners[eventId].Contains(listener)) _listeners[eventId].Remove(listener); } } /// /// 实时广播事件 /// public static void SendMessage(IEventMessage message) { int eventId = message.GetType().GetHashCode(); SendMessage(eventId, message); } /// /// 实时广播事件 /// public static void SendMessage(int eventId, IEventMessage message) { if (_listeners.ContainsKey(eventId) == false) return; LinkedList> listeners = _listeners[eventId]; if (listeners.Count > 0) { var currentNode = listeners.Last; while (currentNode != null) { currentNode.Value.Invoke(message); currentNode = currentNode.Previous; } } } /// /// 延迟广播事件 /// public static void PostMessage(IEventMessage message) { int eventId = message.GetType().GetHashCode(); PostMessage(eventId, message); } /// /// 延迟广播事件 /// public static void PostMessage(int eventId, IEventMessage message) { var wrapper = new PostWrapper(); wrapper.PostFrame = UnityEngine.Time.frameCount; wrapper.EventID = eventId; wrapper.Message = message; _postingList.Add(wrapper); } } }