Godot从0开始的教程—4.计分板
记分板、幻灯片和对话系列简介
以下三个系列是同一项目的一部分。他们将帮助您建立必要的基础来编写对话系统。
到最后,您将编写分支对话系统的基础代码,如视觉小说和日本角色扮演游戏中所见。

在第一个项目中,您将创建一个记分牌,列出用户的姓名和高分。

然后,您将编写一个“游戏介绍幻灯片”。这是一系列插图,并附有玩家可以翻阅的文字。您将对线性对话系统使用相同的代码。

最后,您将在分支对话系列的显示中添加选择和分支。
通过这三个项目,您将学习如何:
在 Godot 中创建用户界面。
从播放器获取文本或按钮输入。
使用 GDScript 代码动态创建节点。
使用代码加载和实例化场景。
使用字典创建分支数据结构。
和更多。您将开始使用数组、字典、信号和 onready变量。这将建立在您目前所学的基础上。
我们选择让您为这个项目创建用户界面,因为它们是我们发现的最容易教给您的方法。
记分板是幻灯片的垫脚石,幻灯片是分支对话系统的垫脚石。
练习将第一次偏离课程。您将重复使用在这里学到的内容来创建待办事项列表、党员状态显示等。
有了这个,让我们开始我们的记分牌。
找到课程文件
首先,在 Godot 中打开项目“Learn to Code with Godot: Practices”,然后在FileSystem dock 中展开 Scoreboard目录。没有场景可以开,我们一起来创造场景!教程见!
记分牌:介绍
在本系列的第一个项目中,您将创建一个记分牌。
https://www.bilibili.com/video/BV1ik4y1n79v?p=1

我们将项目分为三个阶段,以使其更容易消化。
首先,您将创建一个使用函数调用列出名称的面板。

然后,您将添加一个表单,允许玩家输入他们的名字并在面板中列出。

最后,您将从字典中加载现有名称和分数。这是以后支持保存和加载乐谱所必需的。
我们不会考虑从硬盘驱动器保存或加载数据。
这是您稍后将在课程中学习的内容,但本系列将为您提供编写游戏保存代码的必要基础。
设计得分面板
https://www.bilibili.com/video/BV1ik4y1n79v?p=2
在第一个视频中,我们一起设计了高分面板。
这涉及使用专用于用户界面的Godot节点。
创建用户界面很复杂,所以如果您没有从一开始就了解所有细节,请不要担心。您将在课程中再次使用这些节点,并通过实践更好地理解它们。
新概念
控制节点
Godot 带有许多专用于用户界面 (UI) 设计的节点:节点。它们在 创建新节点窗口中都有一个绿色图标。

为了让您了解节点的强大程度,您在 Godot 编辑器中看到的所有内容本身都使用了它们。

当您设计用户界面时,您需要可以自由嵌套和组合的框和小部件。
不同的游戏和应用程序需要不同的用户界面,因此 UI 设计系统往往既灵活又复杂。
这就是为什么 Godot 的节点在Inspector中带有许多部分和属性。

每个节点都是一个可调整大小的框,它相对于父框进行锚定和调整大小,最大的是游戏窗口。
在视频中,您可以看到当我们选择一个节点并使用 Layout -> Full Rect时。四个绿色别针代表记分牌的定位点。

节点框和这些引脚之间的距离定义了节点的边距(下面的黄色箭头)。

当玩家调整游戏窗口大小时,计分板也会调整大小但相对于游戏窗口的角保持固定边距。

集装箱
节点是节点的子类别,可以自动重新定位和调整其子节点的大小:
拉伸它的孩子以适应面板。
对其子项强制执行固定边距。
将其子项排列在一列中。
Godot 带有所有基本容器来显示行、列、网格等中的其他节点。
使用 Label 节点显示文本
该节点允许您绘制未格式化的行或文本段落。
它具有可用于大写、换行或重新对齐文本的设置。
这就是这部分的内容。在下一课中,您将仅使用代码在看板上显示姓名列表。
使用主题设计记分牌
https://www.bilibili.com/video/BV1ik4y1n79v?p=3
在本视频中,我们使用 Godot 的资源为我们的界面提供默认字体和更好的面板样式。
新概念
资源
在 Godot 中,资源通常是您插入节点的文件。纹理、声音和字体都是资源的示例。
我们在本视频中查看了其中的几个:资源、以及我们分配给记分牌面板的 。
更准确地说,资源是 Godot 高效加载和重用的数据容器。
您游戏的大部分共享数据都将依赖于资源,例如您在整个用户界面中重复使用的字体。
下面概述的每个块对应于一种不同类型的资源。

字体文件
您的计算机使用字体文件来绘制文本。

这些文件包含每个文本字符的绘图,采用称为矢量的特定图像格式。它允许计算机绘制任何大小的文本,而不会使文本变得模糊或像素化。

常见的字体文件扩展名是.ttf(TrueType 字体:Apple 的专有格式)和.otf(OpenType 字体:一种开放格式)。
Godot中的动态字体资源
要更改文本的字体和绘图大小,Godot 需要您创建一个资源。该资源使用一个字体文件来绘制文本,并使用一些设置来更改文本大小、线条大小等。

在分数面板中列出名称
在本课中,我们将向记分板添加代码以显示姓名列表。

右键单击Scoreboard节点并选择Attach Script为其提供一个新脚本。

确保模板设置为Empty,然后单击 Create。

我们想要在ScoresColumn节点中列出姓名和分数。对于每个名称,我们将使用一个 Label节点。
由于我们需要各种名称,因此我们不想手动创建标签节点。
相反,我们将使用代码动态创建标签。
使用代码创建节点
到目前为止,我们已经使用“创建新节点”窗口在编辑器中创建了节点。

您还可以使用 GDScript 代码创建节点,如下所示:
您编写节点类型的名称后跟
.new()。例如,Timer.new(),或Sprite.new()。您可以使用节点的属性(例如
Sprite.texture.您可以使用成员函数将其添加为另一个节点的子节点
add_child()。
在您添加一个节点作为另一个节点的子节点之前,它只存在于计算机的内存中,不会影响显示。
下面是使用代码创建节点的代码示例 Label。
另一个创建一个 Timer.
使用代码的好处是我们可以根据需要创建任意数量的节点,而无需事先知道它们的数量。
创建标签的函数
让我们编写一个函数来将名称添加到记分板。我们将调用它, add_line()因为我们稍后将使用它来注册玩家的姓名和分数。
我们首先创建一个 Label节点并将对它的引用存储在 line变量中。text 然后我们通过变量访问标签的成员变量line。
设置节点不会使其出现在屏幕上。要显示标签,我们必须将它添加到我们的节点树中。
我们想添加标签作为ScoresColumn节点的子节点,以便它们垂直排列。
所以我们首先获取ScoresColumn节点,并通过调用 ScoresColumn的add_child()函数将其添加为它的子节点。
注意:在 Godot 中, the$是函数的别名get_node()。
你给它一个节点的路径,函数返回一个对该节点的引用。获取节点允许您访问节点的函数和变量。
将分数列存储在变量中
您可以看到ScoresColumn的节点路径很长且难以阅读。我们的代码用一个变量来标记它会更具可读性。
GDScript 中的一个好习惯是为您在脚本顶部使用的节点创建成员变量。
它一目了然地向您显示脚本工作所需的节点。
但是,我们不能只将节点存储在成员变量中。在访问节点之前,我们需要等待节点处于就绪状态。
等待节点准备就绪
当您运行一个场景时,Godot 会创建节点并将它们按顺序添加到场景树中。在此之前,您的代码中无法访问子节点:您无法使用符号$来访问该节点。
我们说节点还没有准备好。
Godot 提供了一个特殊的函数,你可以编写它来在所有子节点就绪时运行代码:
您可以使用它来获取子节点并将其存储在脚本成员变量中。
然后,每次你想访问ScoresColumn节点时,你可以写scores_column.
onready快捷方式
由于分配对变量的引用非常普遍,GDScript 提供了一个关键字来在子项准备好时设置变量: onready。
我们可以使用它将ScoresColumn存储在变量中。您需要在add_line() 函数上方添加以下行。
请注意,必须onready位于 var关键字之前。此外,它仅在定义成员变量时有效。
通过上面的行,您可以在函数中使用变量 add_line()。您的代码应如下所示:
将名字添加到乐谱
要向记分牌添加一条线,您需要调用该 add_line()函数。
我们必须在函数内部执行此_ready()操作,因为该 add_line()函数需要ScoresColumn 节点。
您可以根据需要多次调用该函数。如果您运行场景 ( F6),您应该会看到一个名称列表。

你的问题
_ready() 是如何保证我能拿到节点的?
函数和函数_ready()一样_process() ,是在Godot引擎中定义的。它存在于每个节点上。
当您运行一个场景时,Godot 会读取您的场景文件并准备创建一个节点树。
Godot 首先从上到下依次创建节点。
然后,Godot_ready()按照两个规则调用节点上的函数:
引擎从上到下处理节点。
每当节点有子节点时,引擎都会
_ready()在父节点之前调用子节点。
在我们的记分板场景中,引擎将从上到下创建节点,使它们可以使用,从 开始,然后是,然后是ScoresColumn,顺序如下。

然后,它会让父级 VBoxContainer准备就绪,然后是,最后是 记分牌。 MarginContainer
这种方法允许您让子节点在将它们放入函数_ready()或使用onready关键字之前正确地初始化它们自己。
“虚”是什么意思?
and 函数定义void后的关键字表示函数不返回值。add_line()_ready()
如果您指定该函数是void,如果您或队友试图从中返回一个值,Godot 会警告您。
代码
这是第一课的完整代码。
添加表单以输入您的姓名
在本课中,您将添加一个字段,让玩家将他们的名字添加到记分牌中。

我们将首先设计一个带有确认按钮的名称表单,让玩家输入他们的名字。
然后,我们将编写将字段中键入的名称注册到记分板的功能。
在下一课中,我们将添加一个按钮来隐藏记分板并返回到窗体。

这将允许您在记分牌中输入多个名称。
创建 ScoreForm 场景
要添加表单并使其与记分板通信,我们需要一个包含表单和记分板实例的场景。
转到Scene -> New Scene创建一个新的空场景,然后单击Scene dock中的User Interface按钮。

一个节点出现在您的场景停靠栏中。将其重命名为ScoreForm。

我们想要一行包含一个输入字段和一个表单按钮。
选择ScoreForm后,创建一个新节点。该节点将其子节点排成一行。
然后,创建一个节点和一个作为. 将 重命名为NameField并将 重命名为OkButton。
到目前为止,您的场景应该如下所示。

使表格更宽
我们的表单很小,卡在视图的左上角。
我们需要几个步骤才能使其沿着ScoreForm节点边界框的上边缘延伸 :
首先,选择,然后在顶部的工具栏中单击Layout -> Top Wide。

2.选择后,单击并拖动底部调整大小手柄以使容器更高。

3.选择名称字段。在Inspector中,打开Size Flags -> Horizontal中的Expand复选框。

名称字段现在应该挤压视图右上角的按钮。

将节点设置为在容器内扩展会使其增长并将同级节点推至最小尺寸。
我们可以通过给它一些文本来增加按钮的最小宽度。选择OkButton并在Inspector中将其Text设置为“Ok” 。

当我们这样做的时候,让我们选择 NameField并给它一些占位符文本。在Inspector中,展开其 Placeholder类别并将Text设置为类似“Enter your name”的内容。

然后,您可以选择ScoreForm,按Alt,然后单击并拖动其中一个角调整大小手柄以使其变小。

如您所见,文本看起来与记分牌不同。要解决这个问题,请选择ScoreForm并在Inspector中展开。右键单击 [empty]插槽并选择Quick Load。

加载scoreboard_theme.tres我们之前保存的文件。
实例化记分牌场景
当我们点击OkButton时,我们想要显示 带有输入名称的记分牌。为此,我们需要添加记分板的实例作为表单的子项。这将允许我们调用它的add_line()函数。
选择ScoreForm并单击场景停靠栏顶部的链接图标以打开实例子场景 窗口。

搜索Scoreboard.tscn并按Enter添加节点。
我们想先看到表格,但Scoreboard将其隐藏。单击场景停靠栏中记分板旁边的眼睛图标 以默认隐藏它。

你的场景应该是这样的。

请将场景保存在目录Scoreboard.tscn中的文件旁边Scoreboard/。
设计好表单后,我们就可以添加代码并在记分板上显示输入的名称。我们将在下一课中这样做。
按确定按钮时添加分数
当玩家点击OkButton时,我们想要注册他们在记分板上输入的名字。
为此,我们需要:
将新脚本附加到ScoreForm。
将OkButton的
pressed信号连接到 ScoreForm。获取记分板节点并调用其
add_line()函数。
右键单击ScoreForm节点并选择附加脚本为其创建一个空脚本。我们需要脚本来连接按钮的信号。

连接按钮的按下信号
选择OkButton节点。

在右侧的停靠栏中,双击 pressed信号并将其连接到 ScoreForm。

这会将您带到脚本编辑器并创建一个新 _on_OkButton_pressed()函数。
按下按钮时注册名称
我们需要访问 Scoreboard和NameField 节点以使用玩家输入的文本。
所以我们onready在脚本的顶部定义了两个变量。
然后,我们可以 在回调函数中调用Scoreboard的函数。add_line()我们还调用它的show() 函数使其可见并重置NameField以清空该字段 text。
用按钮隐藏记分牌
当玩家输入名字时,他们会卡在记分牌上。

我们可以使用 a Button及其pressed信号来隐藏面板。
在Scoreboard场景中,选择 VBoxContainer节点并添加一个新的 Button名为HideButton的子节点。

在检查器顶部 将按钮的文本设置为“隐藏” 。

该按钮水平拉伸以填充它可用的空间。我们想把它放在左下角。
为此,我们必须进行两项更改:
使ScoresColumn垂直展开并按下按钮。
将按钮更改为不填充所有可用的水平空间。
选择ScoresColumn并在Inspector中,向下转到Size Flags类别。展开它并选中 Vertical旁边的Expand复选框。

Vertical标志使容器内的控制节点尝试使自己尽可能高。
然后,选择HideButton并在Size Flags 类别中,取消选中Horizontal旁边的 Fill复选框。

Fill标志进行 Control拉伸以占用所有水平或垂直轴空间。
连接按钮的按下信号
选择HideButton后,前往 Nodedock 将其信号连接pressed到Scoreboard。

在 Godot 为我们创建的函数中, _on_HideButton_pressed()我们想调用 hide(). 单击按钮后它将隐藏记分牌。
代码
到目前为止,这是ScoreForm和 Scoreboard的完整代码。
ScoreForm.gd
Scoreboard.gd
将分数添加到记分板表单
在本课中,我们将在表单和记分牌中添加一个分数字段。

我们将首先更新记分板以在每一行中接受一个名字和一个分数。
我们将创建一个代表一条得分线的新场景来实现这一点。
然后我们将在表单中添加一个分数字段,并在按下 OkButton 时将玩家姓名和分数发送到记分 牌。
创建 ScoreLine 场景
我们将首先设计一个场景来表示一行。
它应该是一排,其中一个代表分数,另一个代表球员的名字。

创建一个新场景并单击其他节点按钮以创建一个.

将节点重命名为ScoreLine并添加两个节点作为其子节点。
将节点分别重命名为PointsLabel和 NameLabel以区别它们。

我们可以将分数染成黄色,以将其与球员姓名区分开来。
首先,我们要为每个标签添加一些占位符文本。为此,选择每个节点并在Inspector中,在其文本字段中写入一些内容 。

然后,选择PointsLabel。在Inspector中,向下滚动到节点部分下方的Visibility类别。
展开类别并将调制颜色更改为黄色。

将场景保存在目录中,并通过右键单击脚本并选择附加脚本Scoreboard/将脚本附加到ScoreLine节点。
我们定义了两个函数,我们将用作记分板的接口 来显示分数和名称。
这两个功能相似:它们更新标签的文本。
与直接访问节点(如points_label.
它允许您稍后在函数内添加指令,而不会导致游戏出错。
使用记分牌中的新 ScoreLine
打开Scoreboard脚本并将 add_line()函数替换为以下代码。我们稍后会分解它。
在第一行,我们做了两件事:
预加载ScoreLine场景。
创建一个新实例并将其存储在
line变量中。
该preload()函数允许您使用绝对或相对路径加载资源文件,如场景。
这是一个特殊的函数,它告诉 Godot 在启动游戏时加载一次场景,然后将其保存在内存中。这样,我们可以快速创建它的新实例。
像以前一样,我们将行添加为ScoresColumn的子级。在这种情况下,场景实例有点像节点:您可以将其添加为另一个节点的子节点。
最后两行调用我们在 ScoreLine场景中定义的两个函数,分别传递球员姓名和得分。
将分数字段添加到 ScoreForm
现在,我们将向ScoreForm添加一个 points 字段。
打开ScoreForm场景并复制 NameField节点。将新节点重命名为 PointsField。

在Inspector中,我们可以删除Placeholder -> Text。

在脚本中,我们需要在一个新 onready变量中获取我们的点字段。在顶部周围,添加变量。
然后,我们需要更新我们的信号回调函数。
我们更新对Scoreboard.add_line()函数的调用并将PointField的文本传递给它。
目前,即使字段为空,玩家也可以将新名称和分数添加到记分牌中。
我们可以在函数的开头使用条件来防止这种情况发生。
return 请注意,在上面的代码清单中,我们没有在关键字后面写任何内容。写入只是return结束函数的执行,并不返回任何值。
此代码更改完成了本课程。您现在可以运行场景,输入名称和分数,它应该会出现在记分牌上。

我们代码的限制
从技术上讲,您可以在分数字段中键入任何文本。
我们不会费心确保您在此处输入数字,因为在完整的游戏中,系统会为玩家计算分数。
实践:库存网格
打开实践库存网格。
完成练习后,跑步场景应如下所示。

练习:诗歌
打开练习诗。
运行场景应该是这样的。

挑战:待办事项清单
打开练习待办事项列表。
最终结果应该是这样的。

代码
这是到目前为止场景的完整代码。
ScoreLine.gd
Scoreboard.gd
ScoreForm.gd
使用字典加载现有乐谱
在最后一部分中,我们从数组中“加载”现有分数。

您将在此处看到的是保存和加载数据的基础,您将在本课程的后面学习实际操作。
我们将对分支对话系统使用相同的技术。
使用数据而不是函数调用
到目前为止,我们直接调用函数将分数添加到记分板。
但是如果你退出游戏再回来,每次的棋盘都是空的,因为你的节点和变量只存在于计算机的临时内存中。
要保存乐谱,您需要将乐谱写入计算机硬盘上的文件中。
你是怎样做的?您将分数作为数据存储在变量中。
与大多数语言一样,Godot 具有内置工具,可以从文件中编写和加载字典、数组、文本等。
在这种情况下,我们需要将玩家的名字映射到他们的分数,因此我们将使用字典。
将名称和分数表示为字典数组
打开记分板脚本。如果手边没有它,可以按Ctrl+ Alt+O使用 “快速打开脚本”窗口。

我们添加一个名为 : 的新成员变量player_scores,将玩家的名字映射到他们的分数。
每个键是一个玩家的名字,对应的值是他们的整数分数。
我会让你像上面那样写几个名字和分数对。
在计分板上显示分数
为了将分数“加载”到记分板中,我们定义了函数 _ready()并循环遍历每个分数。
player_scores我们通过调用 函数在记分牌中为字典中的每个名字添加一行 add_line()。
我们可以使用您在从零开始学习 GDScript 应用程序中学习的字典访问符号来获得每个名称的分数: player_scores[name]。
更新玩家的分数
除了在我们的字典中显示分数之外,我们还想让它们保持最新。
如果玩家打破了他们之前的最佳成绩,或者如果新玩家完成了游戏,我们希望对其进行跟踪。
我们更新add_line()函数以存储新玩家得分。
如果您现在运行ScoreForm场景,在输入姓名和分数后,您应该会看到您的姓名已添加到列表底部。

稍后,您将学习如何从硬盘保存和加载数据以及如何正确构建数据。
但我们必须一步一个脚印。
您在这个项目中学到了许多新技术。在接下来的两个项目中,您将重用和构建您在这里学到的知识。
代码
这是该项目的完整代码。
ScoreLine.gd
Scoreboard.gd
ScoreForm.gd
创建节点和场景实例
本指南回顾了如何创建节点和场景的实例。
我们将讨论:
new()调用和 函数的区别instance()。如何使用
new().如何使用
instance().如何将实例添加为其他节点的子节点
add_child()。何时应使用代码创建节点。
如何加载场景文件、脚本或资源。
load()和 功能的区别preload()。
如果我们将编程比作烹饪,将 Godot 引擎比作厨师:
脚本就是食谱。_ 它描述了如何制作一道新菜。我们可以根据细节定制每道菜,例如添加更多或更少的盐。这种定制将是您的变量。从 脚本中,我们可以创建新节点。
一个场景文件是一个完整的菜单。这是一堆带有配料的食谱,因此 Godot 可以按照您最初设计的那样精确地重新制作多道菜肴。我们从场景文件创建节点分支。
脚本和场景文件都是您制作复制品的模板。
和函数new()_ instance()
有两个函数分别创建一个节点和一个场景实例:new()和instance()。
new()如果您想要一个 脚本实例,或者您想要一个场景instance()实例,您可以使用。
注意:虽然instance()仅用于场景,new()但也用于比节点更多的类型。您将在课程的后面了解到这一点。
函数.new()_
创建特定节点类型时,您使用 Object.new(). 它是Godot中存在于脚本和内置对象类型(节点是特定类型的对象)上的函数 。
下面,我们使用该new()函数以编程方式创建三个按钮。
当 Godot 读到这一行时 var button := Button.new():
它使用配方。
它创建了.
当您使用场景停靠栏中的添加节点按钮(或按 + )在编辑器中添加节点时,在幕后,Godot 会调用 .CtrlA.new()


函数instance()_
创建场景实例时,您使用 .instance(). 例如:
当 Godot 读到这一行时 var heart_pickup := pickup_heart_scene.instance():
它使用
pickup_heart_scene菜单。它再现了您在编辑器中设计的场景。
当您在编辑器中打开场景文件,或在场景eock 中使用添加场景实例按钮添加场景 (或按 + + )时,Godot 会 在幕后调用。CtrlShiftA.instance()


函数add_child() _
一旦你有了一个实例,无论你使用instance() 还是new(),你都会想要将它添加到场景树中。不在场景树中的节点不执行任何操作。
你这样做add_child():
上面的代码可以生成如下所示的节点树:

什么时候应该在代码或编辑器中创建节点
一般来说,最好从编辑器中创建节点和场景。您可以获得更好的视觉预览,并且可以使用 Inspector调整属性。
但请考虑以下情况:
您需要一个箱子来提供随机物品。
您需要敌人数量不断增加。
您需要列出玩家所有已占用的保存槽。
您有一个清单,其中可以包含玩家拾取的任何物品。
你有一个高分板,可以加载最好的球员并显示他们。
在这些示例中使用编辑器创建节点很困难,因为您还不知道需要什么。
那就是您会喜欢使用代码创建节点的时候。
我们如何加载场景文件、脚本或资源?
Godot 让我们通过将文件路径作为参数传递给函数来加载文件preload()。
运行场景时,此函数会在屏幕上显示任何内容之前加载文件。
您可以通过右键单击文件并从上下文菜单中选择复制路径来从文件系统停靠栏复制文件的绝对路径。
您还可以使用快捷键 Ctrl+ Shift+C来更快地完成它。
例如:
使用相对文件路径preload()
我们建议尽可能使用相对路径,因为它可以更轻松地在您的 Godot 项目中移动文件。
例如,如果你要加载的场景与你正在使用的脚本在同一个目录中,你可以这样写路径:
当您在编辑器中打开资源时,Godot 会在后台使用相同的机制加载它。
使用 load()函数代替preload()
如果您事先不知道资源的路径,则无法使用该preload()功能。相反,您将使用该 load()函数。
例如:
上面的代码将加载一个名为 的图像 res://common/arrows/arrow_west_red.png,但我们可以动态更改color和direction以加载不同的文件。
该load()函数与 有重要区别 preload():
编辑器不检查路径。如果通过调用加载一个不存在的文件
load(),编辑器无法提前知道。使用preload(),如果你使用了错误的路径,编辑器会立即报错。路径不能是相对的。该函数
load()只接受绝对路径。
信号:连接和良好实践
本指南回顾了到目前为止我们所看到的有关信号的所有内容:
如何使用代码或编辑器连接信号。
何时使用任一连接方法。
回调函数是什么以及如何命名它们。
信号是节点在发生某些事情时发出的消息。例如,当您单击 a 时,它会发出pressed 信号。

通过将信号连接到节点,您可以让 Godot 在每次信号发出时调用该节点的函数。我们称该函数为回调,因为它在信号发出时被“回调”。
连接信号
连接信号有两种方式:
在 Godot 编辑器中使用Node dock。
通过在代码中调用
connect()函数。
何时连接代码或编辑器
在以下情况下使用编辑器连接信号:
您不需要动态创建节点。
您更喜欢在场景停靠栏和脚本编辑器中看到信号连接的视觉指示。
你想让 Godot 为你创建回调函数。
在以下情况下使用代码连接信号:
您使用代码动态地实例化节点或场景。
您更喜欢将信号连接和回调函数放在同一个文件中。
让我们看看如何使用这两种方法连接按钮的pressed信号。我们将再次使用记分板场景的 HideButton节点作为示例。

如何使用编辑器连接
要使用编辑器连接信号,请在场景停靠栏中选择包含要连接的信号的节点。

在界面的右侧,前往Inspector旁边的Node dock 。停靠栏列出了所选节点的信号。

双击要连接的信号以打开信号连接窗口。

您连接到的节点必须附加一个脚本,以便 Godot 创建它所谓的接收方方法(回调函数)。

您可以连接的节点的名称将显示为白色,而其他节点则显示为灰色。
双击节点或单击“连接”以连接信号。
如果回调函数尚不存在,Godot 将自动在脚本中创建回调函数。它还会将您带到脚本编辑器并滚动到连接的功能。

与编辑器连接时,会出现两个图标。
首先,在Scene dock 中,发射图标位于发射节点旁边。

单击它会重新打开Node dock,其中会显示已连接的信号。

然后,在脚本编辑器中,回调函数左侧的空白处会出现一个图标。

单击它可显示有关哪个节点将哪个信号连接到此功能的信息。

当您开始将多个信号连接到同一个回调函数时,它特别有用,因为它们都列在这个弹出窗口中。
如何通过代码连接
要通过代码连接到信号,请connect() 在具有信号的节点上调用函数。
该connect()函数具有三个必需的参数:
信号的名称作为.
对持有回调函数的节点的引用。用于
self连接到您附加脚本的节点。回调函数的名称作为.
该函数有更多可选参数,我们将在本课程的后面探讨。
要将按钮的信号与代码连接起来,我们首先需要获取按钮节点。我们用一个onready变量来做到这一点,并在函数中连接信号_ready()。
# We get a reference to the HideButton node.
对该connect()函数的调用读作“将 HideButton的pressed信号连接到该节点的 _on_HideButton_pressed()函数”。
剩下的就是编写_on_HideButton_pressed() 函数并向其提供您在按下按钮时需要运行的指令。
回调函数
Godot 用户遵循命名信号回调函数的约定:_on_NodeName_signal_name().
例如,如果您连接名为HideButtonpressed的节点的信号,您将调用函数 。_on_HideButton_pressed()
这只是一个指南。稍后,您会看到我们通常更喜欢将信号直接连接到现有函数,而不是创建新的回调函数。
如果您使用编辑器连接节点,Godot 将负责根据此约定命名节点。
这就是第一个信号回顾指南。展望未来,您将学习如何创建新信号、从代码中发出它们,以及管理多个信号连接的新技术。
备忘单:最有用的 UI 节点入门
Godot 有许多 UI 节点,适用于任何用户界面,从简单到复杂。
庞大的功能集一开始很容易让您不知所措。
这个简短的备忘单列出了开始在 Godot 中创建用户界面的最有用的节点。
您将使用最多的节点
我们建议您从六个非常有用的 UI 节点开始。
, 显示文本。

,玩家可以点击它与用户界面进行交互。

,其中显示了一张图片。

,它为玩家提供了一个可编辑的文本字段。您可以将其用于登录表单或供玩家在多人游戏中输入昵称。

,显示带有可选滚动条的大文本框并支持文本格式(斜体、粗体等)。

, 绘制水平或垂直条。您可以将其用于健康栏或加载进度显示。

我们使用了记分板系列中的前三个节点,我们将在接下来的两个系列中使用和。
最有用的容器
还有一些您会经常使用的节点:
正如我们已经看到的那样,它在一列中对齐它的子项。

将其子项排成一行。下面,您可以看到一个.

对其子项应用固定边距。下面,边距容器在面板边缘和按钮之间创建空间。

可以在孩子身后画一个面板,让他们伸展以填充面板。我们经常将它与 结合起来,例如,围绕人物肖像创建一个框架。

节点会自动放置和调整其子节点(其他容器、按钮、标签等)的大小。当 UI 节点是容器的直接子节点时,您不能再手动移动子节点。
有时您会需要其他节点,但以上十个节点应该可以满足您的大部分需求。

