Skip to content

Instantly share code, notes, and snippets.

@bitbutter
Last active November 17, 2025 09:06
Show Gist options
  • Select an option

  • Save bitbutter/d3255b4950e2ace60a4d7dadc2c3ab63 to your computer and use it in GitHub Desktop.

Select an option

Save bitbutter/d3255b4950e2ace60a4d7dadc2c3ab63 to your computer and use it in GitHub Desktop.
SignalGroup. Wait for all of, or any of, an array of signals.
'''
Based on https://shaggydev.com/2025/06/12/godot-awaiting-signals/
# usage
var sigs=[
get_tree().create_timer(0.1).timeout,
get_tree().create_timer(0.1).timeout,
get_tree().create_timer(0.1).timeout,
]
var sg := SignalGroup.new()
await sg.wait_all(sigs)
# or
var sg := SignalGroup.new()
await sg.wait_any(sigs)
'''
class_name SignalGroup
extends RefCounted
signal all_complete
signal any_complete
var _counter: int = 0
## Waits for all signals in the provided array to be emitted before continuing.
func wait_all(signals: Array) -> void:
var one_signal_complete = func(_a = null, _b = null, _c = null, _d = null, _e = null, _f = null, _g = null, _h = null, _i = null, _j = null) -> void:
_counter -= 1
if _counter == 0:
all_complete.emit()
_counter = signals.size()
if _counter == 0:
return
for sig in signals:
sig.connect(one_signal_complete, CONNECT_ONE_SHOT)
await all_complete
## Waits for any one of the signals in the provided array to be emitted before continuing.
func wait_any(signals: Array) -> void:
var emit_any_complete = func(_a = null, _b = null, _c = null, _d = null, _e = null, _f = null, _g = null, _h = null, _i = null, _j = null) -> void:
any_complete.emit()
for sig in signals:
sig.connect(emit_any_complete, CONNECT_ONE_SHOT)
await any_complete
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment