移动/游戏
Godot 信号驱动架构:用「信号向上…
在 Godot 中实现事件系统或解耦节点时,用类型化信号、信号链、一次性连接和 AutoLoad 事件总线构建松耦合架构。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Godot 信号驱动架构:用「信号向上、特定
解决思路
- 使用 `signal.connect(_callback)` 而非旧式字符串版 `Object.connect()`,以获得编译期校验、避免拼写错误导致的静默失败。
- 信号只用于表达过去发生的事件(如 `died`、`health_changed`),命令式行为(如 `kill`、`apply_damage`)用直接方法调用。
- 不要对同一个 Callable 重复连接同一信号,否则运行时会抛 `ERR_INVALID_PARAMETER`;如需叠加连接,使用 `Object.CONNECT_REFERENCE_COUNTED` 标志。
- 不要用全局信号总线传递局部数据,场景内逻辑用本地连接,避免污染全局状态、增加调试难度。
- 回调不必接收信号的全部参数,用 `unbind()` 丢弃不需要的参数以保持 API 干净。
- 不要创建循环信号依赖(A 信号 B、B 又信号回 A),用中介者(父节点或 AutoLoad)打破循环。
- 始终为信号添加类型标注,如 `signal moved(dir: Vector2)`,而非 `signal moved`,以获得编辑器支持。
- 动态信号必须记得断开,否则产生幽灵连接并报「call on null instance」错误;在 `_exit_tree()` 中或重定向目标时断开(参考 disconnect_ghost_signals.gd)。
- 发射信号时不要在发射者上立即产生副作用:若 `died.emit()` 中调用 `queue_free()`,监听者可能来不及响应,应先 emit 再处理。
- 不要用信号传输高频数据流(如每秒 1000+ 次的逐粒子更新),改用共享数组或直接缓冲区。
- 遵循「信号向上、调用向下」:子节点向父节点发过去式信号,父节点用直接调用/属性操作子节点,兄弟节点通过父级中介或受限的 AutoLoad 总线通信,绝不硬引用兄弟节点。
- 按作用域选择连接方式:子通知父/UI 用父节点 `_ready` 中的本地 `signal.connect`;父编排子用向下方法调用;跨场景/系统(成就、存档)用 AutoLoad 总线;线性异步步骤(加载→淡出→生成)用 `await` 信号序列;重定向跟踪(新敌人)先断开旧连接;一次性/物理安全用 `CONNECT_ONE_SHOT`/`CONNECT_DEFERRED`;需要额外上下文或丢弃参数用 `Callable.bind`/`unbind`。
- 注意 lambda 捕获清理:Godot 在节点释放时自动断开大多数连接,但捕获局部变量的 lambda 例外,必须手动断开——保存 `my_lambda: Callable`,在 `_exit_tree()` 中检查 `is_connected(my_lambda)` 后 `disconnect(my_lambda)`;重定向时优先用命名方法或 disconnect_ghost_signals.gd。
- 正确理解 `CONNECT_REFERENCE_COUNTED`:它表示多次相同连接共享一个带引用计数的连接(连接 N 次/断开 N 次),并非「发射者释放时自动清理」,也不能修复捕获 lambda 的泄漏;普通连接到 Object 方法(非捕获)在任一方释放时自动清理,捕获 lambda 始终需手动 disconnect,发射后自动移除用 `CONNECT_ONE_SHOT`。
- 使用 `is_connected` 守卫动态连接(参考 safe_dynamic_connections.gd),用 `CONNECT_APPEND_SOURCE_OBJECT` 跟踪信号发射源(参考 track_signal_emitter_source.gd),用 signal_debugger.gd / signal_spy.gd 做调试与测试间谍。
- 按需查阅深度配方:模式 1–7 及注意事项见 references/implementation-patterns.md;仅在研究具体 API 时打开官方文档链接,路由到相邻领域时再加载相关技能,不要预加载整个技能网络。
适用边界 · 注意事项
- 不要用信号做自顶向下的行为指令(命令用直接方法调用)。
- 不要用全局信号总线传递局部数据。
- 不要用信号传输每秒 1000+ 次的高频数据流。