在本课中,您将连接和使用 Godot 的信号。
在视频中,您将学习:
- 使用编辑器界面连接信号。
- 使用代码访问节点并连接信号。
- 在您的代码中定义并发出自定义信号。
您可以在此处下载项目文件以跟随:信号课程入门项目。
下面,我添加了额外的见解,以便在观看视频后更进一步。
首先,我们将讨论是什么让信号成为有用的功能。然后,我们将讨论信号连接代码如何工作的技术细节。
为什么使用信号
正如我们在有关Godot 的 4 个基本概念的课程中看到的那样,信号允许您使节点进行通信。
有多种方法可以使节点在代码中进行通信。
信号只是其中之一,您将在使用 Godot 制作游戏时学习和比较替代方案。每种方法都有其用途。
在这里,我们专注于信号,因为这是从头开始创建完整游戏之前缺少的最后一块。
信号的优点是它们可以帮助您保持代码的干净和灵活。
当特定事件发生时,Godot 的所有节点和对象都会发出信号。例如,当玩家点击按钮时,按钮会发出pressed信号。
您可以将该信号连接到另一个节点,例如角色,以对该按钮按下作出反应。
信号连接到函数,所以当玩家点击一个按钮时,Godot 会为你调用目标函数。
编辑器还向您显示带有图标的信号连接,这有助于您跟踪连接。
它在两个地方这样做。
首先,在场景停靠栏中,它在连接到另一个节点的节点旁边显示一个图标。您可以单击该图标跳转到节点停靠栏。
其次,在脚本中,在接收信号的函数旁边,有一个图标告诉您 Godot 将调用它。
您可以单击该图标以查看连接表。
总之,信号很有用,因为它们允许您收听特定事件并做出反应。此外,编辑器可以帮助您跟踪连接。
分解信号连接语法
代码中有信号语法的细节,我没有在视频中介绍。让我们在这里讨论一下。
在视频中,我们得到了对Timer节点的引用,并timeout像这样连接到它的信号:
func _ready():
# We get a reference to a child node named "Timer" and store it in a new
# variable.
var timer = get_node("Timer")
# We connect the timer's `timeout` signal to this node's
# `_on_Timer_timeout()` function.
timer.connect("timeout", self, "_on_Timer_timeout")
这里,connect()是我们在Timer节点上调用的方法。它需要三个参数:要发出的信号、要连接的对象以及发出信号时要调用的函数。
请注意我们如何传递信号名称和函数名称以在引号内调用。
我们使用引号来表示文本字符串。在 Godot 3 中,您经常使用文本来引用信号、函数或节点的名称,如对get_node().
我在这里谈论的对象和节点几乎可以互换。有什么不同?
如上一课所述,您可以将对象视为将数据(属性)和行为(方法)捆绑在一起的小型机器。Timer像和一样的节点Sprite是特定种类的对象。
在 Godot 中,每个节点类型都扩展了基本Object类型,它是游戏引擎的一部分,让您可以访问信号。
理解SELF关键字
当连接到timeout信号时,我们用作self第二个参数。
selfGDScript 中的关键字指定脚本附加到的对象。在这种情况下,它是我们的飞行Godot头。
有许多编程语言可以在其中self大量编写该关键字(或等效项)来指定应该运行代码的对象。例如,您将在 Python 或 JavaScript 等语言中看到这一点。
但不是在 GDScript 中,这要归功于引擎。Godot 总是将您的 GDScript 代码视为隐式运行在您附加到的对象或节点上。
当我们得到一个节点时,像这样:
getnode(“Timer”)
这和写法一样:
self.get_node(“Timer”)
它读作:“我,_Godot节点,想要获得对名为 的子节点的引用Timer”。
只有少数情况需要self在 GDScript 中使用。通过代码连接信号是一种情况。另一个与超出本系列范围的语言特性有关,setter 和 getter 函数。我们不会在这里使用它们。
有了这个,你已经了解了所有基础知识,开始在 Godot 中创建完整的游戏。在下一部分中,您将逐步从头开始创建一个完整的 2D 游戏。
09.signal-in-scene-dock.png