






























信号(Signal)是Godot引擎中最强大、最重要的机制之一,它实现了观察者模式,让节点之间可以松耦合地通信。本教程将通过实际案例,带你全面掌握Godot中的信号使用方法。
信号是一种事件通知机制。当一个节点发生某些事情时(比如按钮被点击、分数改变、动画播放完成等),它可以发出一个信号,其他节点可以”监听”这个信号,并在信号发出时执行相应的代码。
信号的核心优势:
Godot的许多节点都内置了信号,比如Button节点就有pressed信号。
我们的main.tscn场景包含:
Button节点(按钮)Label节点(标签),绑定label.gd脚本

选中button后,在节点面板中设置信号
这表示:当Button的pressed信号发出时,调用Label节点的_on_button_pressed方法。
在label.gd中,我们定义了响应函数:
extends Label
func _on_button_pressed() -> void:
# 这里就是按钮点后会执行代码的地方
self.text = "按钮被点击啦!!!!!"
运行效果:
Button发出pressed信号Label的_on_button_pressed函数被调用
除了内置信号,我们还可以创建自己的信号,用于传递自定义事件。
在score_manager.gd中,我们声明了一个带参数的信号:
extends Node
# 声明一个带参数的自定义信号,参数类型是整数 (int)
signal score_updated(new_score: int)
var current_score = 0
当分数改变时,我们发出信号并传递新的分数值:
func increase_score(points: int):
current_score += points
# 当分数改变时,发出信号,并附带新的分数值
emit_signal("score_updated", current_score)
这里使用了emit_signal()函数,第一个参数是信号名称,后面是传递给信号的参数。
注意:在Godot 4中,你也可以直接使用信号名称来发出信号:
score_updated.emit(current_score)
在score_label.gd中,我们连接到这个信号:
extends Label
@onready var score_manager: Node2D = $".." #连接到场景中的根节点ScoreManager
func _ready():
# 在 _ready 函数中连接信号
# 当 score_manager 发出 score_updated 信号时,执行 _on_score_manager_score_updated
score_manager.score_updated.connect(_on_score_manager_score_updated)
# 这是我们响应信号的函数
func _on_score_manager_score_updated(new_score: int):
# 更新 Label 的文本,显示新的分数
self.text = "Score: " + str(new_score)
关键点解析:
@onready:延迟初始化,确保节点树已经构建完成connect():连接信号的方法在score_manager.gd的_ready函数中,我们测试信号:
func _ready() -> void:
increase_score(10) # ScoreLabel 显示 Score: 10
await get_tree().create_timer(2.0).timeout # 等待2秒
increase_score(5) # ScoreLabel 显示 Score: 15
await get_tree().create_timer(2.0).timeout # 等待2秒
increase_score(5) # ScoreLabel 显示 Score: 20
运行效果:
步骤:
优点:
score_manager.score_updated.connect(_on_score_manager_score_updated)
优点:
如果不再需要监听某个信号,可以断开连接:
score_manager.score_updated.disconnect(_on_score_manager_score_updated)
使用call_deferred可以让信号只触发一次:
button.pressed.connect(_on_button_pressed, CONNECT_ONE_SHOT)
信号可以传递多个参数:
signal player_died(player_name: String, score: int, cause: String)
emit_signal("player_died", "Player1", 100, "Enemy")
if score_manager.score_updated.is_connected(_on_score_manager_score_updated):
print("信号已连接")
score_updated、player_died、game_over_on_节点名_信号名,如_on_button_pressed适合使用信号的场景:
不适合使用信号的场景:
_process或_physics_process)信号连接本身开销很小,但要注意:
_process中频繁连接/断开信号通过本教程,我们学习了:
信号是Godot开发中的核心概念,掌握它将让你的代码更加模块化、可维护。
本教程项目包含以下文件:
main.tscn:演示内置信号(Button pressed)label.gd:响应按钮点击信号score_manager.tscn:演示自定义信号score_manager.gd:定义和发出自定义信号score_label.gd:监听并响应自定义信号祝你在Godot开发之路上越走越远! 🚀
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。