Skip to content

基础用法示例

本示例展示 GDSignalBus 的基础功能,包括信号发射、订阅和频道管理。

完整示例代码

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)
	# 创建频道信号
	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 信号触发")
	print("信号列表:")
	print(bus.get_signal_list())
	print("频道列表:")
	print(bus.get_channel_list())
	print("订阅signal1_on_channel信号的订阅者数量:")
	print(bus.get_subscriber_count("signal1_on_channel"))

func on_channel1_signal():
	print("channel1 信号触发")

func on_channel2_signal():
	print("channel2 信号触发")

func on_signal_with_arg(message):
	print("my_signal 接收到参数")
	print(message)

功能说明

1. 基础信号订阅和发射

gdscript
# 订阅信号
bus.subscribe("my_signal", on_signal_activate)
bus.subscribe("my_signal", on_signal_with_arg)

# 发射信号
bus.emit("my_signal", [])                    # 无参数
bus.emit("my_signal", ["Hello SignalBus"])   # 带参数

2. 频道管理

gdscript
# 在不同频道订阅相同信号名
bus.subscribe_on_channel("channel1", "signal1_on_channel", on_channel1_signal)
bus.subscribe_on_channel("channel2", "signal1_on_channel", on_channel2_signal)

# 在指定频道发射信号
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. 调试和信息查询

gdscript
# 启用调试模式
bus.set_debug_enabled(true)

# 获取系统信息
print(bus.get_channel_list())        # 获取频道列表
print(bus.get_signal_list())          # 获取信号列表
print(bus.get_subscriber_count("signal1_on_channel"))  # 获取订阅者数量

控制说明

运行示例后,可以使用以下按键测试不同功能:

  • UI Accept (通常为 Enter 或空格): 发射无参数的 my_signal 信号
  • UI Up (方向键上): 在 channel1 频道发射 signal1_on_channel 信号
  • UI Down (方向键下): 在 channel2 频道发射 signal1_on_channel 信号
  • UI Left (方向键左): 发射带参数的 my_signal 信号
  • UI Right (方向键右): 在默认频道发射带参数的 my_signal 信号

输出示例

当按下不同按键时,控制台会显示相应的输出:

my_signal 信号触发
信号列表:
[my_signal, signal1_on_channel]
频道列表:
[default, channel1, channel2]
订阅signal1_on_channel信号的订阅者数量:
2
channel1 信号触发
channel2 信号触发
my_signal 接收到参数
Hello SignalBus

核心概念

信号订阅

  • subscribe(signal_name, callback): 在默认频道订阅信号
  • subscribe_on_channel(channel, signal_name, callback): 在指定频道订阅信号

信号发射

  • emit(signal_name, args): 在默认频道发射信号
  • emit_on_channel(channel, signal_name, args): 在指定频道发射信号

频道隔离

相同信号名在不同频道中是独立的,这允许你在不同模块中使用相同的信号名而不产生冲突。

这个基础示例展示了 GDSignalBus 的核心功能,为更复杂的应用场景奠定了基础。

基于 MIT 许可发布