using System;
using System.Collections.Generic;
namespace Cielonos.MainGame.Base
{
///
/// 全局泛型消息总线,提供极致的注册与派发性能。
/// 基于结构体/类事件容器,零 GC 装箱。
///
public static class GameEventBus
{
// 核心技术:利用 C# 泛型的静态特性,每当 T 变化时,都会独立生成一个 EventBus 实例。
// 这意味着派发事件时,连字典查表的哈希开销都不需要,直接访问对应类型的 Action 链!
private static class EventNode where T : IGameEvent
{
public static Action OnEvent;
}
///
/// 订阅一个特定类型的事件。
/// 注意:请在生命周期结束(如 OnDestroy)时务必调用 Unsubscribe,否则会导致内存泄漏。
///
public static void Subscribe(Action onEvent) where T : IGameEvent
{
EventNode.OnEvent += onEvent;
}
///
/// 取消订阅一个特定类型的事件。
///
public static void Unsubscribe(Action onEvent) where T : IGameEvent
{
EventNode.OnEvent -= onEvent;
}
///
/// 广播一个事件。所有订阅了该事件的监听器将立即同步处理。
///
public static void Publish(T gameEvent) where T : IGameEvent
{
EventNode.OnEvent?.Invoke(gameEvent);
}
}
///
/// 所有事件必须实现该空接口。
/// 使用 Struct 作为事件可以完全消除由于 new Event 引发的堆内存分配 (GC Alloc)。
///
public interface IGameEvent {}
}