JisolGame/JNFrame/Assets/Plugins/JNGame/Util/EventDispatcher.cs

107 lines
3.6 KiB
C#
Raw Normal View History

2024-01-26 19:15:07 +08:00
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Plugins.JNGame.Util
{
/// <summary>
/// 静态事件分发器
/// </summary>
public class EventDispatcher
{
2024-01-29 19:07:52 +08:00
public static readonly EventDispatcher Event = new EventDispatcher();
2024-01-26 19:15:07 +08:00
public Dictionary<string, List<Delegate>> EventHandlers { get; private set; } = new();
2024-01-29 02:28:42 +08:00
/// <summary>
/// 添加事件监听器
/// </summary>
/// <param name="eventId">事件标识符</param>
/// <param name="listener">事件监听器</param>
2024-01-29 19:07:52 +08:00
public void AddListener(string eventId, Action listener)
2024-01-29 02:28:42 +08:00
{
if (!EventHandlers.ContainsKey(eventId))
{
EventHandlers[eventId] = new List<Delegate>();
}
EventHandlers[eventId].Add(listener);
Debug.Log(eventId+ "AddListener" + EventHandlers[eventId].Count);
}
2024-01-26 19:15:07 +08:00
/// <summary>
/// 添加事件监听器
/// </summary>
/// <typeparam name="T">事件参数类型</typeparam>
/// <param name="eventId">事件标识符</param>
/// <param name="listener">事件监听器</param>
public void AddListener<T>(string eventId, Action<T> listener)
{
if (!EventHandlers.ContainsKey(eventId))
{
EventHandlers[eventId] = new List<Delegate>();
}
EventHandlers[eventId].Add(listener);
Debug.Log(eventId+ "AddListener" + EventHandlers[eventId].Count);
}
/// <summary>
/// 移除事件监听器
/// </summary>
/// <typeparam name="T">事件参数类型</typeparam>
/// <param name="eventId">事件标识符</param>
/// <param name="listener">事件监听器</param>
public void RemoveListener<T>(string eventId, Action<T> listener)
{
if (EventHandlers.ContainsKey(eventId))
{
//eventHandlers[eventId] = (Action<T>)eventHandlers[eventId] - listener;
EventHandlers[eventId].Remove(listener);
Debug.Log(eventId + "RemoveListener" + EventHandlers[eventId].Count);
}
}
/// <summary>
/// 分发事件
/// </summary>
/// <typeparam name="T">事件参数类型</typeparam>
/// <param name="eventId">事件标识符</param>
/// <param name="args">事件参数</param>
public void Dispatch<T>(string eventId, T args)
{
if (EventHandlers.ContainsKey(eventId) && EventHandlers[eventId] != null)
{
foreach(Delegate fun in EventHandlers[eventId])
{
// 确保 fun 实际上是指向一个 Action<T> 类型的函数
if (fun.Method.GetParameters().Length == 1 && fun.Method.GetParameters()[0].ParameterType == typeof(T))
{
((Action<T>)fun)(args);
}
}
}
}
2024-01-29 19:07:52 +08:00
public void Dispatch(string eventId)
{
if (EventHandlers.ContainsKey(eventId) && EventHandlers[eventId] != null)
{
foreach(Delegate fun in EventHandlers[eventId])
{
// 确保 fun 实际上是指向一个 Action<T> 类型的函数
if (fun.Method.GetParameters().Length == 0)
{
((Action)fun)();
}
}
}
}
2024-01-26 19:15:07 +08:00
public void Reset()
{
EventHandlers = new();
}
}
}