跳转至

链式连接

var signals := Gf.get_utility(GFSignalUtility) as GFSignalUtility

signals.connect_signal(
    button.pressed,
    func(panel_id: String) -> void:
        _open_panel(panel_id),
    self,
    ["inventory"]
).once()

signals.connect_signal(slider.value_changed, func(value: float) -> void:
    _update_volume(value)
, self).filter(func(value: float) -> bool:
    return value >= 0.0
).debounce(0.05)

# 节点或对象销毁前也可以按 owner 一次性断开
signals.disconnect_owner(self)

filter()map()delay()debounce()throttle()skip()take()scan() 会按链式顺序执行。

delay() 会保留每一次通过前置步骤的触发,并在等待后继续传递;debounce() 才会在静默期内丢弃旧触发,只让最后一次继续。

first()take(1) 的语义糖,start_with(value) 可立即向链路注入一次初始值。

connect_any() 可把多个 Signal 接到同一个回调,返回的连接列表可交给 disconnect_connections() 批量断开。

connect_once()once() 会在首次成功触发后自动断开并从工具追踪中移除。

connect_signal() 返回的链式对象类型是 GFSignalConnection,通常不需要手动保存。只有需要主动 disconnect_signal()、延迟追加操作或查询连接状态时才保留引用。

生命周期与限制

连接会用弱引用追踪 owner。prune_invalid_connections() 会清理 owner、信号源或回调目标已经失效的连接。

当前连接包装器、异步等待 payload 捕获、GFSignalBridgeBinding 和运行时信号探针最多收集 16 个信号参数。超过这个数量的极少数自定义信号应直接使用 Godot 原生连接,或自行封装 payload。

delay() / debounce() 使用 SceneTree 计时器或帧等待做信号层等待。throttle() 使用系统毫秒时间做信号层节流,适合 UI、编辑器工具和轻量运行时事件。这些链式操作不是 GFTimerUtility 的替代品,也不会表达 GF 逻辑时间组的暂停语义。