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,避免把内部实现细节广播到全局。
