2025-11-13 23:17:53 +08:00

82 lines
3.3 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class CardEventSvc
{
private readonly Dictionary<(CardOSData.EVENT_REGISTER_CARD_ENUM, Delegate), Action<object>> delegateMap = new(); // 委托地址, 用于取消注册
private readonly Dictionary<CardOSData.EVENT_REGISTER_CARD_ENUM, Action<object>> broadcastActions = new(); // 广播事件地址
// private readonly Dictionary<CardOSData.EVENT_REGISTER_CARD_ENUM, Dictionary<int, Action<object>>> EVENT_BROADCAST = new(); // 单播事件事件
private readonly Dictionary<CardOSData.EVENT_REGISTER_CARD_ENUM, Type> actionBindMap = new()
{
{ CardOSData.EVENT_REGISTER_CARD_ENUM.EVENT_LET_ME_DRAW_CARD, typeof(CardOSData.STRUCT_EVENT_DRAW_CARD) },
{ CardOSData.EVENT_REGISTER_CARD_ENUM.EVENT_LET_OS_DEAL_CARD_FINISH, typeof(int) },
{ CardOSData.EVENT_REGISTER_CARD_ENUM.EVENT_LET_ME_DROP_CARD, typeof(CardOSData.STRUCT_EVENT_DROP_CARD) }
};
private bool CHECK_BIND_DATACLASS(CardOSData.EVENT_REGISTER_CARD_ENUM eventName, Type t, string msgName)
{
if (!actionBindMap.ContainsKey(eventName))
{
Debug.LogError($"{msgName}: 未绑定数据类型[{eventName}]");
return false;
}
if (actionBindMap[eventName] != t)
{
Debug.LogError($"{msgName}: 数据类型不匹配[{eventName}]=>期望数据类型[{actionBindMap[eventName]}]");
return false;
}
return true;
}
public void EVENT_REGISTER<T>(CardOSData.EVENT_REGISTER_CARD_ENUM eventName, Action<T> callback) where T : struct
{
if (!CHECK_BIND_DATACLASS(eventName, typeof(T), "注册广播事件失败")) return;
broadcastActions.TryAdd(eventName, null);
Action<object> wrapper = (obj) => callback((T)obj);
delegateMap[(eventName, callback)] = wrapper; // 保存委托映射
broadcastActions[eventName] += wrapper;
Debug.Log($"注册广播事件: [{eventName}]");
}
public void EVENT_UNREGISTER<T>(CardOSData.EVENT_REGISTER_CARD_ENUM eventName, Action<T> callback) where T : struct
{
if (!CHECK_BIND_DATACLASS(eventName, typeof(T), "注销广播事件失败")) return;
if (!broadcastActions.ContainsKey(eventName))
{
Debug.LogWarning($"注销广播事件失败: 未创建的广播事件[{eventName}]");
return;
}
if (delegateMap.TryGetValue((eventName, callback), out var wrapper))
{
broadcastActions[eventName] -= wrapper;
delegateMap.Remove((eventName, callback));
Debug.Log($"注销广播事件: [{eventName}]");
}
else
{
Debug.LogWarning($"注销广播事件失败: 未找到匹配的委托映射用于注销[{eventName}]");
}
}
public void EVENT_TRIGGER(CardOSData.EVENT_REGISTER_CARD_ENUM evetName, object data)
{
if (!CHECK_BIND_DATACLASS(evetName, data.GetType(), "触发消息失败")) return;
if (broadcastActions.TryGetValue(evetName, out var action))
{
Debug.Log($"触发广播事件: [{evetName}]");
action?.Invoke(data);
}
else
{
Debug.LogWarning($"触发广播事件错误: 未找到事件[{evetName}]");
}
}
}