c#游戏事件系统

/// <summary>
/// 游戏事件分发器,用于监听、广播游戏事件。
/// </summary>
public static class EventDispatcher
{
    public delegate void EventListener(Dictionary<string, object> args);

    /// <summary>
    /// 广播指定事件。
    /// </summary>
    /// <param name="eventId">事件编号</param>
    /// <param name="args">事件参数</param>
    public static void Dispatch(int eventId, Dictionary<string, object> args = null)
    {
        var luaListeners = getLuaEventListener(eventId);
        for (var i = 0; i < luaListeners.Count; i++)
        {
            var listener = luaListeners[i];
            listener.Function.Call(listener.Self, args);
        }


        var listeners = getEventListeners(eventId);
        for (var i = 0; i < listeners.Count; i++)
            listeners[i].Invoke(args);
    }

    /// <summary>
    /// 添加对指定事件的监听。
    /// </summary>
    /// <param name="eventId">事件编号</param>
    /// <param name="listener">回调委托</param>
    [NoToLua]
    public static void AddListener(int eventId, EventListener listener)
    {
        var listeners = getEventListeners(eventId);
        listeners.Add(listener);
    }

    /// <summary>
    /// 移除对指定事件的监听。
    /// </summary>
    /// <param name="eventId">事件编号</param>
    /// <param name="listenerToBeRemoved">回调委托</param>
    [NoToLua]
    public static void RemoveListener(int eventId, EventListener listenerToBeRemoved)
    {
        var listeners = getEventListeners(eventId);
        for (var i = 0; i < listeners.Count; i++)
        {
            var listener = listeners[i];
            if (listener == listenerToBeRemoved)
            {
                listeners.RemoveAt(i);
                break;
            }
        }
    }


    /// <summary>
    /// 清除所有的事件监听器。
    /// </summary>
    public static void Clear()
    {
        _listeners.Clear();
        _luaListeners.Clear();
    }


    private static List<EventListener> getEventListeners(int eventId)
    {
        List<EventListener> ret;
        if (_listeners.TryGetValue(eventId, out ret))
            return ret;
        ret = new List<EventListener>();
        _listeners.Add(eventId, ret);
        return ret;
    }

    private static readonly Dictionary<int, List<EventListener>> _listeners = new Dictionary<int, List<EventListener>>();
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值