Project AS Developer Doc Help

第6章 模块交互机制(Communication & Event System)

模块交互机制用于协调游戏各子系统之间的数据传递、状态响应与行为触发,避免系统之间的直接耦合,确保良好的可维护性与模块独立性。本项目核心采用**事件总线机制(EventBus)**为通信主干,结合观察者模式用于 UI 与数据层同步。

6.1 全局消息派发器(EventBus)

项目中所有系统通过注册监听器接收事件,解耦逻辑层与触发源。

基础结构设计:

public static class EventBus { private static Dictionary<Type, List<Delegate>> _listeners = new(); public static void Subscribe<T>(Action<T> callback) { var type = typeof(T); if (!_listeners.ContainsKey(type)) _listeners[type] = new List<Delegate>(); _listeners[type].Add(callback); } public static void Publish<T>(T evt) { var type = typeof(T); if (_listeners.ContainsKey(type)) { foreach (var del in _listeners[type]) ((Action<T>)del)(evt); } } public static void Unsubscribe<T>(Action<T> callback) { ... } }

使用方式示例:

// 发布资源变动 EventBus.Publish(new ResourceChangedEvent { type = ResourceType.Food, newAmount = 120 }); // 监听资源更新 EventBus.Subscribe<ResourceChangedEvent>((e) => { uiPanel.UpdateFood(e.newAmount); });

6.2 数据流机制:单向流与响应式绑定

模块之间的通信采用单向数据流为主,必要时通过事件推送触发状态同步。

原则:

  • 状态源(如 ResourceSystem)为唯一数据拥有者

  • 所有依赖模块通过事件或接口获取副本数据

  • 避免双向绑定或循环调用,降低耦合风险

示例流动路径:

[探索系统] → 资源发现 → EventBus.Publish(ResourceGained) ↓ [资源系统] ← 更新数据 ↓ [任务系统/UI] ← 监听 ResourceChangedEvent

6.3 UI 与系统通信策略

UI 层不直接持有系统引用,而通过事件监听与方法调用进行数据联动。

UI 响应系统状态:

  • UI 通过订阅 EventBus 接收系统数据更新

  • 所有更新统一由系统主动广播事件

UI 请求系统行为:

  • UI 按钮等通过 System.DoSomething() 明确触发器方法(不直接修改数据)

  • 系统再根据规则产生状态更新,并广播事件 → UI 刷新

推荐架构图:

点击按钮

广播状态变更

事件订阅

UI Layer

EventBus

系统模块

6.4 扩展建议

  • 事件调试面板(Editor-only) :可视化显示当前事件监听者与触发记录

  • 异步事件支持 :支持 EventBus.PublishAsync() 处理协程型流程

  • 模块事件隔离机制 :可使用命名空间或通用前缀分类事件,防止冲突

  • 内建事件类型清单文档化 :所有可用事件及其结构应在附录中统一列出

15 七月 2025