
导航目录:共(8)个目录
godot4中一个很重要的东西就是信号,信号就是,这边发送信号,那边响应。
看官方说明:
信号的官方说明
Error connect(signal: StringName, callable: Callable, flags: int = 0)
按名称将 signal 连接到 callable。还可以添加可选的 flags 来配置该连接的行为(请参阅 ConnectFlags 常量)。
一个信号只能连接到同一个 Callable 一次。如果该信号已经连接,除非该信号是使用 CONNECT_REFERENCE_COUNTED 连接的,否则该方法会返回 ERR_INVALID_PARAMETER 并推送一条错误消息。为防止这种情况,请首先使用 is_connected() 检查已存在的连接。
如果 callable 的对象被释放,则该连接将会丢失
然后再看官方案例
官方推荐的写法:
推荐写法1:
直接用信号.connect
推荐案例:
hit.connect
更小的案例
还有5级案例
再个6级案例
连接信号是 Godot 中最常见的操作之一,API 提供了许多这样做的选项,这些选项将在下面进一步介绍。下面的代码块显示了推荐的方法。
一个信号只能连接到同一个 Callable 一次。如果该信号已经连接,除非该信号是使用 CONNECT_REFERENCE_COUNTED 连接的,否则该方法会返回 ERR_INVALID_PARAMETER 并推送一条错误消息。为防止这种情况,请首先使用 is_connected() 检查已存在的连接。
如果 callable 的对象被释放,则该连接将会丢失。
推荐语法的示例:
连接信号是 Godot 中最常见的操作之一,API 提供了许多这样做的选项,这些选项将在下面进一步介绍。下面的代码块显示了推荐的方法。
func _ready():
var button = Button.new()
# 这里的 `button_down` 是一个 Signal 变体类型,因此我们调用 Signal.connect() 方法,而不是 Object.connect()。
# 请参阅下面的讨论以更深入地了解该 API。
button.button_down.connect(_on_button_down)
# 这假设存在一个“Player”类,它定义了一个“hit”信号。
var player = Player.new()
# 我们再次使用 Signal.connect() ,并且我们还使用了 Callable.bind() 方法,
# 它返回一个带有参数绑定的新 Callable。
player.hit.connect(_on_player_hit.bind("剑", 100))
func _on_button_down():
print("按钮按下!")
func _on_player_hit(weapon_type, damage):
print("用武器 %s 击中,造成 %d 伤害。" % [weapon_type, damage])
看到这里,有人要疑惑了,
Object.connect() 还是 Signal.connect()?
如上所示,推荐的连接信号的方法不是 Object.connect()。下面的代码块显示了连接信号的四个选项,使用该传统方法或推荐的 Signal.connect(),并使用一个隐式的 Callable 或手动定义的 Callable。
这段话,通俗的解释::
信号.connect(方法) 或者 信号.connect(方法.bind())
而信号== Object.hit/button_down 等等,看到这里明白了吧
下面是不推荐的写法: 大家可以对比下。
结论:带callable的很明显不占优势
func _ready():
var button = Button.new()
# 选项 1:Object.connect() 并使用已定义的函数的隐式 Callable。
button.connect("button_down", _on_button_down)
# 选项 2:Object.connect() 并使用由目标对象和方法名称构造的 Callable。
button.connect("button_down", Callable(self, "_on_button_down"))
# 选项 3:Signal.connect() 并使用已定义的函数的隐式 Callable。
button.button_down.connect(_on_button_down)
# 选项 4:Signal.connect() 并使用由目标对象和方法名称构造的 Callable。
button.button_down.connect(Callable(self, "_on_button_down"))
func _on_button_down():
print("按钮按下!")
说完了信号,下面说下信号的触发emit_signal()
信号的触发以及绑定和传递参数综合案例:
绑定和传递参数:
绑定参数的语法是通过 Callable.bind(),它返回一个绑定了参数的 Callable 的副本。
当调用 emit_signal() 时,信号参数也可以被传递。下面的示例显示了这些信号参数和绑定参数之间的关系。
func _ready():
# 这假设存在一个 `Player` 类,它定义了一个 `hit` 信号。
var player = Player.new()
# 使用 Callable.bind()。
player.hit.connect(_on_player_hit.bind("剑", 100))
# 发出信号时添加的参数首先被传递。
player.emit_signal("hit", "黑暗领主", 5)
# 我们在发出时传递两个参数(`hit_by`,`level`),
# 并在连接时再绑定两个参数(`weapon_type`、`damage`)。
func _on_player_hit(hit_by, level, weapon_type, damage):
print("被 %s(等级 %d)用武器 %s 击中,造成 %d 伤害。" % [hit_by, level, weapon_type, damage])