--- title: Godot 信号系统 description: 以当前 GFramework.Godot 源码与 CoreGrid 的动态绑定用法为准,说明 Signal(...) fluent API、SignalBuilder 行为与接入边界。 --- # Godot 信号系统 `GFramework.Godot` 当前提供的信号能力很收敛:它不是另一套事件系统,也不是自动生成绑定代码的入口,而是对 `GodotObject.Connect(...)` 的一层 fluent 包装。 当前真正公开的入口只有两个: - `SignalFluentExtensions.Signal(...)` - `SignalBuilder` 如果你需要的是场景节点字段注入和静态 signal 自动绑订,请看 `GFramework.Godot.SourceGenerators` 的 `[GetNode]` 与 `[BindNodeSignal]`,不要把它们和这里的运行时 fluent API 混成同一层。 ## 当前公开入口 ### `Signal(...)` `Signal(...)` 是定义在 `GodotObject` 上的扩展方法: ```csharp public static SignalBuilder Signal(this GodotObject @object, StringName signal) ``` 它只做一件事:基于目标对象和 signal 名称创建一个 `SignalBuilder`。这意味着当前 fluent API 不只适用于 `Node`,也适用于 其他 Godot 对象。 ### `SignalBuilder` `SignalBuilder` 的当前行为来自运行时代码本身: - `WithFlags(GodotObject.ConnectFlags flags)` - 把 flags 保存到 builder 内部,作为后续 `To(...)` / `ToAndCall(...)` 的默认连接选项 - `To(Callable callable, GodotObject.ConnectFlags? flags = null)` - 优先使用参数传入的 flags;如果没有,再回退到之前 `WithFlags(...)` 保存的值 - 最终直接调用 `target.Connect(signal, callable)` 或 `target.Connect(signal, callable, (uint)flags)` - `ToAndCall(Callable callable, GodotObject.ConnectFlags? flags = null, params Variant[] args)` - 先执行 `To(...)` - 再立即执行一次 `callable.Call(args)` - `End()` - 返回原始 `GodotObject` - 主要用于在 fluent 语句结束后重新拿回目标对象,而不是增加新的信号语义 可以把它理解成“对原生 `Connect(...)` 做顺手的链式包装”,而不是带订阅管理、自动解绑、诊断系统的高层抽象。 ## 最小接入路径 ### 1. 动态绑定时直接用 `Signal(...)` 适合这类场景: - 运行时创建的节点或弹窗 - signal 名称需要按条件选择 - 你就是想保留手写 `Callable` 的控制权 最小示例: ```csharp using GFramework.Godot.Extensions.Signal; using Godot; public partial class SettingsPanel : Control { public override void _Ready() { var applyButton = GetNode