Skip to content

EventModule 事件系统

EventModule 是跨模块、跨系统使用的全局强类型事件总线。默认 Fire 采用帧末派发:事件先进入类型化队列,再在本帧所有 Module 的 OnUpdate 完成后,于 EventModule.OnLateUpdate 按触发顺序统一消费。

对于实体、Package 或单个系统内部的局部通信,框架提供独立的 EventDispatcher,它立即派发,并支持按 owner 批量清理订阅。

子功能

设计思路与生命周期

每个全局事件类型使用一个静态 EventChannel<T>

  • payload 保存在 Queue<T>,结构体不装箱。
  • 订阅者保存在 Action<T>
  • 另一条 Queue<IEventChannel> 只记录跨类型触发顺序,不保存 payload。
  • 派发时通道从自己的强类型队列取出一项。

这种设计同时保持强类型、零装箱和跨类型 Fire 顺序。

EventModule.OnInit 没有异步资源,直接完成初始化。OnClear 清空顺序队列和全部已登记通道。框架还在 SubsystemRegistration 阶段重置静态通道,避免 Unity 关闭 Domain Reload 时把上一轮 Play Mode 的订阅带到下一轮。

注意事项与限制

  • 全局订阅没有 owner 自动清理;注册和注销必须成对。
  • 不要用匿名 lambda 订阅后再创建另一个 lambda 取消,因为它们不是同一个委托实例。
  • Clear<T> 会清除所有人的订阅和排队事件,不是单个对象的注销方式。
  • 默认 Fire 不是同步调用。依赖同步结果时显式使用 FireImmediate
  • 派发过程中再次 Fire 会延后到下一帧。
  • EventModule 和 EventDispatcher 都不会捕获业务回调异常;异常会直接暴露,便于修复错误业务逻辑。
  • 高频局部事件优先使用局部 Dispatcher,避免把内部实现细节广播到全局。

SuperCore 使用 MIT License 开源