Skip to content

Basic Usage Example

This example demonstrates the basic functionality of GDSignalBus, including signal emission, subscription, and channel management.

Complete Example Code

gdscript
@warning_ignore_start("static_called_on_instance")
extends Node2D

@onready var bus = SignalBus.get_singleton()

func _ready() -> void:
	bus.set_debug_enabled(true)
	print(bus.get_channel_list())
	bus.subscribe("my_signal", on_signal_activate)
	bus.subscribe("my_signal", on_signal_with_arg)
	# Create channel signals
	bus.subscribe_on_channel("channel1", "signal1_on_channel", on_channel1_signal)
	bus.subscribe_on_channel("channel2", "signal1_on_channel", on_channel2_signal)
	
func _process(_delta: float) -> void:
	if Input.is_action_just_pressed("ui_accept"):
		bus.emit("my_signal", [])
	if Input.is_action_just_pressed("ui_up"):
		bus.emit_on_channel("channel1", "signal1_on_channel", []) 
	if Input.is_action_just_pressed("ui_down"):
		bus.emit_on_channel("channel2", "signal1_on_channel", []) 
	if Input.is_action_just_pressed("ui_left"):
		bus.emit("my_signal", ["Hello SignalBus"])
	if Input.is_action_just_pressed("ui_right"):
		bus.emit_on_channel("default", "my_signal", ["Hello SignalBus"])

func on_signal_activate():
	print("my_signal signal triggered")
	print("Signal list:")
	print(bus.get_signal_list())
	print("Channel list:")
	print(bus.get_channel_list())
	print("Number of subscribers for signal1_on_channel:")
	print(bus.get_subscriber_count("signal1_on_channel"))

func on_channel1_signal():
	print("channel1 signal triggered")

func on_channel2_signal():
	print("channel2 signal triggered")

func on_signal_with_arg(message):
	print("my_signal received parameter")
	print(message)

Feature Description

1. Basic Signal Subscription and Emission

gdscript
# Subscribe to signals
bus.subscribe("my_signal", on_signal_activate)
bus.subscribe("my_signal", on_signal_with_arg)

# Emit signals
bus.emit("my_signal", [])                    # No parameters
bus.emit("my_signal", ["Hello SignalBus"])   # With parameters

2. Channel Management

gdscript
# Subscribe to the same signal name in different channels
bus.subscribe_on_channel("channel1", "signal1_on_channel", on_channel1_signal)
bus.subscribe_on_channel("channel2", "signal1_on_channel", on_channel2_signal)

# Emit signals in specific channels
bus.emit_on_channel("channel1", "signal1_on_channel", [])
bus.emit_on_channel("channel2", "signal1_on_channel", [])
bus.emit_on_channel("default", "my_signal", ["Hello SignalBus"])

3. Debug and Information Query

gdscript
# Enable debug mode
bus.set_debug_enabled(true)

# Get system information
print(bus.get_channel_list())        # Get channel list
print(bus.get_signal_list())          # Get signal list
print(bus.get_subscriber_count("signal1_on_channel"))  # Get subscriber count

Control Instructions

After running the example, you can use the following keys to test different features:

  • UI Accept (usually Enter or Space): Emit my_signal without parameters
  • UI Up (Up arrow): Emit signal1_on_channel signal in channel1
  • UI Down (Down arrow): Emit signal1_on_channel signal in channel2
  • UI Left (Left arrow): Emit my_signal with parameters
  • UI Right (Right arrow): Emit my_signal with parameters in the default channel

Output Example

When pressing different keys, the console will display corresponding output:

my_signal signal triggered
Signal list:
[my_signal, signal1_on_channel]
Channel list:
[default, channel1, channel2]
Number of subscribers for signal1_on_channel:
2
channel1 signal triggered
channel2 signal triggered
my_signal received parameter
Hello SignalBus

Core Concepts

Signal Subscription

  • subscribe(signal_name, callback): Subscribe to signals in the default channel
  • subscribe_on_channel(channel, signal_name, callback): Subscribe to signals in a specific channel

Signal Emission

  • emit(signal_name, args): Emit signals in the default channel
  • emit_on_channel(channel, signal_name, args): Emit signals in a specific channel

Channel Isolation

The same signal name is independent in different channels, allowing you to use the same signal name in different modules without conflicts.

This basic example demonstrates the core functionality of GDSignalBus, laying the foundation for more complex application scenarios.

Released under the MIT License