第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 刷新
推荐架构图:
6.4 扩展建议
事件调试面板(Editor-only) :可视化显示当前事件监听者与触发记录
异步事件支持 :支持
EventBus.PublishAsync()处理协程型流程模块事件隔离机制 :可使用命名空间或通用前缀分类事件,防止冲突
内建事件类型清单文档化 :所有可用事件及其结构应在附录中统一列出
15 七月 2025