using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public delegate void GameplayEventHandler(params object[] args);
public class EventDispatcher
{
private Dictionary<string, Dictionary<int,GameplayEventHandler>> listeners = new Dictionary<string, Dictionary<int,GameplayEventHandler>>();
private readonly string szErrorMessage = "DispatchEvent Error, Event:{0}, Error:{1}, {2}";
private static EventDispatcher s_instance;
public static EventDispatcher instance
{
get
{
if (null == s_instance)
s_instance = new EventDispatcher();
return s_instance;
}
}
/// <summary>
/// 订阅事件
/// </summary>
/// <param name="eventName">事件名</param>
/// <param name="gameplayEventHandler">事件</param>
public void Regist(string eventName,GameplayEventHandler gameplayEventHandler)
{
if (gameplayEventHandler == null) return;
if(!listeners.ContainsKey(eventName))
listeners.Add(eventName,new Dictionary<int, GameplayEventHandler>());
var handlerDic = listeners[eventName];
var handlerHash = gameplayEventHandler.GetHashCode();
if (handlerDic.ContainsKey(handlerHash))
handlerDic.Remove(handlerHash);
listeners[eventName].Add(gameplayEventHandler.GetHashCode(),gameplayEventHandler);
}
/// <summary>
/// 注销事件
/// </summary>
/// <param name="eventName">事件名</param>
/// <param name="gameplayEventHandler">事件</param>
public void UnRegist(string eventName, GameplayEventHandler gameplayEventHandler)
{
if ( null == gameplayEventHandler)
return;
if (listeners.ContainsKey(eventName))
{
listeners[eventName].Remove(gameplayEventHandler.GetHashCode());
if (null == listeners[eventName] || 0 == listeners[eventName].Count)
{
listeners.Remove(eventName);
}
}
}
/// <summary>
/// 发布事件
/// </summary>
public void DispatcherEvent(string eventName, params object[] objects)
{
if (listeners.ContainsKey(eventName))
{
var handlerDic = listeners[eventName];
if (handlerDic != null && 0 < handlerDic.Count)
{
var dic = new Dictionary<int, GameplayEventHandler>(handlerDic);
foreach (var f in dic.Values)
{
try
{
f(objects);
}
catch (System.Exception ex)
{
Debug.LogErrorFormat(szErrorMessage, eventName, ex.Message, ex.StackTrace);
}
}
}
}
}
/// <summary>
/// 清空事件
/// </summary>
/// <param name="eventName">事件名</param>
public void ClearEvents(string eventName)
{
if (listeners.ContainsKey(eventName))
{
listeners.Remove(eventName);
}
}
}
Unity 事件订阅、注销和发布的管理
最新推荐文章于 2024-10-11 11:47:46 发布