Last active
November 17, 2025 09:06
-
-
Save bitbutter/d3255b4950e2ace60a4d7dadc2c3ab63 to your computer and use it in GitHub Desktop.
SignalGroup. Wait for all of, or any of, an array of signals.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ''' | |
| 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