using System; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
  
 | 
/// <summary> 
 | 
/// 事件广播系统 
 | 
/// </summary> 
 | 
public class EventBroadcast 
 | 
{ 
 | 
    private static EventBroadcast _instance; 
 | 
    public static EventBroadcast Instance 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            if (_instance == null) 
 | 
            { 
 | 
                _instance = new EventBroadcast(); 
 | 
            } 
 | 
            return _instance; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    // 事件字典,存储事件ID和对应的委托列表 
 | 
    private Dictionary<string, Delegate> eventDict = new Dictionary<string, Delegate>(); 
 | 
  
 | 
    // 防止外部实例化 
 | 
    private EventBroadcast() { } 
 | 
  
 | 
    ~EventBroadcast() { 
 | 
        eventDict.Clear(); 
 | 
    } 
 | 
  
 | 
    #region 添加监听 
 | 
  
 | 
    /// <summary> 
 | 
    /// 添加无参事件监听 
 | 
    /// </summary> 
 | 
    /// <param name="eventId">事件ID</param> 
 | 
    /// <param name="callback">回调函数</param> 
 | 
    public void AddListener(string eventId, Action callback) 
 | 
    { 
 | 
        OnListenerAdding(eventId, callback); 
 | 
        eventDict[eventId] = (Action)eventDict[eventId] + callback; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 添加单参数事件监听 
 | 
    /// </summary> 
 | 
    public void AddListener<T>(string eventId, Action<T> callback) 
 | 
    { 
 | 
        OnListenerAdding(eventId, callback); 
 | 
        eventDict[eventId] = (Action<T>)eventDict[eventId] + callback; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 添加双参数事件监听 
 | 
    /// </summary> 
 | 
    public void AddListener<T, U>(string eventId, Action<T, U> callback) 
 | 
    { 
 | 
        OnListenerAdding(eventId, callback); 
 | 
        eventDict[eventId] = (Action<T, U>)eventDict[eventId] + callback; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 添加三参数事件监听 
 | 
    /// </summary> 
 | 
    public void AddListener<T, U, V>(string eventId, Action<T, U, V> callback) 
 | 
    { 
 | 
        OnListenerAdding(eventId, callback); 
 | 
        eventDict[eventId] = (Action<T, U, V>)eventDict[eventId] + callback; 
 | 
    } 
 | 
  
 | 
    #endregion 
 | 
  
 | 
    #region 移除监听 
 | 
  
 | 
    /// <summary> 
 | 
    /// 移除无参事件监听 
 | 
    /// </summary> 
 | 
    /// <param name="eventId">事件ID</param> 
 | 
    /// <param name="callback">回调函数</param> 
 | 
    public void RemoveListener(string eventId, Action callback) 
 | 
    { 
 | 
        if (OnListenerRemoving(eventId, callback)) 
 | 
        { 
 | 
            eventDict[eventId] = (Action)eventDict[eventId] - callback; 
 | 
            OnListenerRemoved(eventId); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 移除单参数事件监听 
 | 
    /// </summary> 
 | 
    public void RemoveListener<T>(string eventId, Action<T> callback) 
 | 
    { 
 | 
        if (OnListenerRemoving(eventId, callback)) 
 | 
        { 
 | 
            eventDict[eventId] = (Action<T>)eventDict[eventId] - callback; 
 | 
            OnListenerRemoved(eventId); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 移除双参数事件监听 
 | 
    /// </summary> 
 | 
    public void RemoveListener<T, U>(string eventId, Action<T, U> callback) 
 | 
    { 
 | 
        if (OnListenerRemoving(eventId, callback)) 
 | 
        { 
 | 
            eventDict[eventId] = (Action<T, U>)eventDict[eventId] - callback; 
 | 
            OnListenerRemoved(eventId); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 移除三参数事件监听 
 | 
    /// </summary> 
 | 
    public void RemoveListener<T, U, V>(string eventId, Action<T, U, V> callback) 
 | 
    { 
 | 
        if (OnListenerRemoving(eventId, callback)) 
 | 
        { 
 | 
            eventDict[eventId] = (Action<T, U, V>)eventDict[eventId] - callback; 
 | 
            OnListenerRemoved(eventId); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    #endregion 
 | 
  
 | 
    #region 触发事件 
 | 
  
 | 
    /// <summary> 
 | 
    /// 触发无参事件 
 | 
    /// </summary> 
 | 
    /// <param name="eventId">事件ID</param> 
 | 
    public void Broadcast(string eventId) 
 | 
    { 
 | 
        if (eventDict.TryGetValue(eventId, out Delegate d)) 
 | 
        { 
 | 
            Action callback = d as Action; 
 | 
            if (callback != null) 
 | 
            { 
 | 
                callback(); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                Debug.LogError($"事件 {eventId} 的委托类型不匹配"); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 触发单参数事件 
 | 
    /// </summary> 
 | 
    public void Broadcast<T>(string eventId, T arg) 
 | 
    { 
 | 
        if (eventDict.TryGetValue(eventId, out Delegate d)) 
 | 
        { 
 | 
            Action<T> callback = d as Action<T>; 
 | 
            if (callback != null) 
 | 
            { 
 | 
                callback(arg); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                Debug.LogError($"事件 {eventId} 的委托类型不匹配"); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 触发双参数事件 
 | 
    /// </summary> 
 | 
    public void Broadcast<T, U>(string eventId, T arg1, U arg2) 
 | 
    { 
 | 
        if (eventDict.TryGetValue(eventId, out Delegate d)) 
 | 
        { 
 | 
            Action<T, U> callback = d as Action<T, U>; 
 | 
            if (callback != null) 
 | 
            { 
 | 
                callback(arg1, arg2); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                Debug.LogError($"事件 {eventId} 的委托类型不匹配"); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 触发三参数事件 
 | 
    /// </summary> 
 | 
    public void Broadcast<T, U, V>(string eventId, T arg1, U arg2, V arg3) 
 | 
    { 
 | 
        if (eventDict.TryGetValue(eventId, out Delegate d)) 
 | 
        { 
 | 
            Action<T, U, V> callback = d as Action<T, U, V>; 
 | 
            if (callback != null) 
 | 
            { 
 | 
                callback(arg1, arg2, arg3); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                Debug.LogError($"事件 {eventId} 的委托类型不匹配"); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    #endregion 
 | 
  
 | 
    #region 辅助方法 
 | 
  
 | 
    /// <summary> 
 | 
    /// 添加监听前的处理 
 | 
    /// </summary> 
 | 
    private void OnListenerAdding(string eventId, Delegate callback) 
 | 
    { 
 | 
        if (!eventDict.ContainsKey(eventId)) 
 | 
        { 
 | 
            eventDict.Add(eventId, null); 
 | 
        } 
 | 
  
 | 
        Delegate d = eventDict[eventId]; 
 | 
        if (d != null && d.GetType() != callback.GetType()) 
 | 
        { 
 | 
            Debug.LogError($"尝试为事件 {eventId} 添加不同类型的委托,当前类型:{d.GetType()},尝试添加类型:{callback.GetType()}"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 移除监听前的处理 
 | 
    /// </summary> 
 | 
    private bool OnListenerRemoving(string eventId, Delegate callback) 
 | 
    { 
 | 
        if (!eventDict.ContainsKey(eventId)) 
 | 
        { 
 | 
            Debug.LogWarning($"尝试移除不存在的事件 {eventId}"); 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        Delegate d = eventDict[eventId]; 
 | 
        if (d == null) 
 | 
        { 
 | 
            Debug.LogWarning($"尝试移除事件 {eventId} 的空委托"); 
 | 
            return false; 
 | 
        } 
 | 
        else if (d.GetType() != callback.GetType()) 
 | 
        { 
 | 
            Debug.LogError($"尝试为事件 {eventId} 移除不同类型的委托,当前类型:{d.GetType()},尝试移除类型:{callback.GetType()}"); 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 移除监听后的处理 
 | 
    /// </summary> 
 | 
    private void OnListenerRemoved(string eventId) 
 | 
    { 
 | 
        if (eventDict[eventId] == null) 
 | 
        { 
 | 
            eventDict.Remove(eventId); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 清空所有事件 
 | 
    /// </summary> 
 | 
    public void ClearAllEvents() 
 | 
    { 
 | 
        eventDict.Clear(); 
 | 
    } 
 | 
  
 | 
    #endregion 
 | 
} 
 |