Unity 事件订阅、注销和发布的管理

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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值