SuperAPI AI 工具集

event-bus

编程与开发

查看项目

更新于 10-16 06:20

技能介绍

用途:在 Godot 4.3+ 中实现互不相关节点之间的解耦通信。做法是创建一个全局单例自动加载(Autoload)EventBus,作为信号的中央注册表;节点不再互相持有引用,而是统一连接或发射到 EventBus。

主要能力:资料给出 GDScript 与 C# 两套信号声明示例(如 player_died、score_changed、health_changed 等),并说明何时该用事件总线、何时用直接信号:父子节点间通知、同一父节点下的兄弟节点、性能敏感的内层循环,宜用直接信号或方法调用;完全无关的节点、UI 响应玩法状态、音频管理器、存档系统等,适合事件总线。

使用方式:创建 res://autoloads/event_bus.gd(或 EventBus.cs),在 Project → Project Settings → Globals → Autoload 中注册为 EventBus。消费者在 _ready() 中连接,GDScript 用 EventBus.player_died.connect(...),C# 用 _eventBus.PlayerDied += OnPlayerDied;生产者在 GDScript 用 EventBus.health_changed.emit(...),C# 用 EmitSignal(EventBus.SignalName.HealthChanged, ...)。

限制与注意:C# 必须在 _ExitTree() 中显式断开连接,否则总线会持有已释放节点的引用,导致内存泄漏或异常;信号参数应全部类型化,复杂载荷建议用 Resource 子类而非 Dictionary;避免过度解耦、处理器副作用再发信号、循环重发同一信号等反模式。测试可用 GUT,针对真实自动加载 EventBus(get_tree().root.get_node("EventBus"))验证发射与接收。