using System; using System.Collections.Generic; using UnityEngine; namespace Plugins.JNGame.Util { /// /// 静态事件分发器 /// public class EventDispatcher { public Dictionary> EventHandlers { get; private set; } = new(); /// /// 添加事件监听器 /// /// 事件标识符 /// 事件监听器 public void AddListener(string eventId, Delegate listener) { if (!EventHandlers.ContainsKey(eventId)) { EventHandlers[eventId] = new List(); } EventHandlers[eventId].Add(listener); Debug.Log(eventId+ "AddListener" + EventHandlers[eventId].Count); } /// /// 添加事件监听器 /// /// 事件参数类型 /// 事件标识符 /// 事件监听器 public void AddListener(string eventId, Action listener) { if (!EventHandlers.ContainsKey(eventId)) { EventHandlers[eventId] = new List(); } EventHandlers[eventId].Add(listener); Debug.Log(eventId+ "AddListener" + EventHandlers[eventId].Count); } /// /// 移除事件监听器 /// /// 事件参数类型 /// 事件标识符 /// 事件监听器 public void RemoveListener(string eventId, Action listener) { if (EventHandlers.ContainsKey(eventId)) { //eventHandlers[eventId] = (Action)eventHandlers[eventId] - listener; EventHandlers[eventId].Remove(listener); Debug.Log(eventId + "RemoveListener" + EventHandlers[eventId].Count); } } /// /// 分发事件 /// /// 事件参数类型 /// 事件标识符 /// 事件参数 public void Dispatch(string eventId, T args) { if (EventHandlers.ContainsKey(eventId) && EventHandlers[eventId] != null) { foreach(Delegate fun in EventHandlers[eventId]) { // 确保 fun 实际上是指向一个 Action 类型的函数 if (fun.Method.GetParameters().Length == 1 && fun.Method.GetParameters()[0].ParameterType == typeof(T)) { ((Action)fun)(args); } } } } public void Reset() { EventHandlers = new(); } } }