Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / event / EventManager.cs

using System;
using System.Collections.Generic;

/// <summary>
/// 事件管理器
/// </summary>
public static class EventManager
{

    private static readonly Dictionary<EventEnum, List<EventBinder>> _eventMap =
        new Dictionary<EventEnum, List<EventBinder>>();

    /// <summary>
    /// 添加监听事件, 并返回事件绑定对象
    /// </summary>
    /// <param name="eventType">监听事件类型</param>
    /// <param name="callback">回调函数</param>
    public static EventBinder AddEventListener(EventEnum eventType, Action<object> callback)
    {
        EventBinder binder;
        if (!_eventMap.TryGetValue(eventType, out var list))
        {
            list = new List<EventBinder>();
            _eventMap.Add(eventType, list);
            binder = new EventBinder(eventType, callback);
            list.Add(binder);
            return binder;
        }

        for (var i = 0; i < list.Count; i++)
        {
            var item = list[i];
            if (item.Callback == callback)
            {
                return item;
            }
        }

        binder = new EventBinder(eventType, callback);
        list.Add(binder);
        return binder;
    }

    /// <summary>
    /// 派发事件
    /// </summary>
    /// <param name="eventType">事件类型</param>
    /// <param name="arg">传递参数</param>
    public static void EmitEvent(EventEnum eventType, object arg = null)
    {
        if (_eventMap.TryGetValue(eventType, out var list))
        {
            var binders = list.ToArray();
            for (var i = 0; i < binders.Length; i++)
            {
                var binder = binders[i];
                if (!binder.IsDiscard)
                {
                    binder.Callback(arg);
                }
            }
        }
    }

    /// <summary>
    /// 根据事件绑定对象移除一个监听事件
    /// </summary>
    public static void RemoveEventListener(EventBinder binder)
    {
        if (_eventMap.TryGetValue(binder.EventType, out var list))
        {
            if (list.Remove(binder))
            {
                binder.IsDiscard = true;
                if (list.Count == 0)
                {
                    _eventMap.Remove(binder.EventType);
                }
            }
        }
    }

    /// <summary>
    /// 移除指定类型的所有事件
    /// </summary>
    public static void RemoveAllEventListener(EventEnum eventType)
    {
        if (_eventMap.TryGetValue(eventType, out var list))
        {
            foreach (var binder in list)
            {
                binder.IsDiscard = true;
            }

            _eventMap.Remove(eventType);
        }
    }

    /// <summary>
    /// 移除所有监听事件
    /// </summary>
    public static void ClearAllEventListener()
    {
        foreach (var kv in _eventMap)
        {
            foreach (var binder in kv.Value)
            {
                binder.IsDiscard = true;
            }
        }

        _eventMap.Clear();
    }
}