节点与术语

在继续之前,必须注意 节点(Node) 术语需要谨慎使用。当指代 可视化脚本节点 (或通常称为 节点)时,此文本将指代用线连接的小盒子,它们是图的一部分。当指代 场景节点 时,它暗指构成场景的元素,它是树的一部分。它们的命名类似,但功能是不同的。除非另有说明,否则在此处指代 节点 时,将暗示指代了 可视化脚本节点

../../../_images/visual_script16.png

节点属性

与大多数可视化脚本实现一样,每个节点都具有可编辑的属性。但是,在Godot中,为了便于阅读,我们尽量避免使用可编辑的控件来复杂化节点。

节点仍将所需信息显示为文本,但编辑是通过 属性检查器 完成的。要编辑它们,请选择任何节点并在 属性检查器 中编辑其属性。

端口和连接

Godot可视化脚本中的编程是通过 节点 和每个函数内的 端口连接 完成的。

端口

Godot可视脚本中的节点具有 端口。这些端点出现在节点的左侧和右侧,并可用于建立 连接端口 有两种类型:序列数据

../../../_images/visual_script17.png

序列端口 指示执行操作的顺序。通常,当一个 节点 完成处理后,它将从右侧的端口之一转到下一个节点。如果未连接任何内容,则该函数可能会终止,或者可能尝试另一个输出 序列端口 (取决于节点)。因此,您可以遵循白线来遵循函数中的逻辑流程。并非每个 节点 都有 序列端口。实际上,大多数都没有。

数据端口 端口包含类型化的值。类型可以是任何常规Godot类型,例如布尔、整数、字符串、Vector3、数组、任何对象或场景节点等。节点右侧的 数据端口 被视为输出, 而左侧的端口是输入。连接它们可以使信息流动到下一个节点。

但并非所有的 数据端口 类型都兼容并且允许连接。要特别注意颜色和图标,因为每种类型都有不同的表示形式:

../../../_images/visual_script18.png

连接

连接是一个相对简单的过程。将 输出端口 拖向 输入端口

../../../_images/visual_script_connect.gif

断开连接需要一点练习。在 数据端口 断开是通过拖走 输入 来实现的,而对于 序列端口,则通过拖走 输出 来实现。

../../../_images/visual_script_disconnect.gif

乍一看这很奇怪,但是发生的原因是 数据端口1:N (单个输出端口可以连接到许多输入),而 序列端口N:1 (许多序列输出可以连接到单个输入)。

连接到空白区域(拖动以进行连接,但在空白区域上未按下)也是上下文相关的,它将提供最常用操作的列表。对序列,它将是条件节点:

../../../_images/visual_script52.png

而对于数据,将打开上下文设置/获取/调用菜单:

../../../_images/visual_script53.png

添加节点

最后!我们到了有趣的部分!但是,在更详细地解释每种类型节点的作用之前,让我们简单地看一下最常添加和处理节点的方式。

访问场景节点

最常见的任务之一是访问场景树节点(同样,不要与 可视化脚本节点 混淆)。从场景树中拖放到画布上,将要求您在此节点上 调用方法 (有时称为 成员函数)。

../../../_images/visual_script19.png

虽然在大多数情况下都需要访问属性(在下面进行更多介绍),但有时 调用方法 也可能有用。方法对对象执行特定的操作。在上述情况下,可以将鼠标指针映射到控件的局部坐标中。另一个常见用例是使用 queue_free 方法对要删除的节点进行排队。

../../../_images/visual_script20.png

必须注意,仅当正在编辑的场景在其中一个节点中包含您的 可视化脚本 时,这才起作用!否则,将出现一个警告。

访问场景节点属性

这是在可视化脚本中编辑 场景节点 的最常用方法。从 场景树 中选择 场景节点 ,转到属性检查器,找到要编辑的属性的 名称 (提示, 是值!)并将其拖到画布上:

../../../_images/visual_script21.png

结果是可以通过写入 数据端口 从脚本中更改此值。

If instead reading this value is desired, drag the node again but hold Ctrl (or Cmd on macOS). This will create a getter:

../../../_images/visual_script22.png

在这种情况下,可以从 数据端口 读取值。

变量

变量是脚本本地的,可以保存值的内存容器。可以通过上一步中描述的方法从脚本的任何函数或从其他脚本中读取此值。

要添加变量,请按成员面板的 变量 部分中的 + 按钮。双击新变量以重命名它:

../../../_images/visual_script23.png

右键单击该变量可以配置其属性:

../../../_images/visual_script24.png ../../../_images/visual_script25.png

如上所示,可以更改变量的类型和初始值,以及一些属性提示。选择 导出 选项会在选择节点时使属性面板中的变量可见。通过上一步中描述的方法,这也使其可用于其他脚本。

../../../_images/visual_script28.png

要在脚本中使用该变量,只需将其拖到画布上即可创建一个 getter

../../../_images/visual_script26.png

Likewise, hold Ctrl (or Cmd on macOS) to drop a setter:

../../../_images/visual_script27.png

信号

也可以在脚本中创建自己的信号并使用它们。为此,除了 信号 之外,执行与上一步中的变量相同的步骤:

../../../_images/visual_script29.png

也可以通过右键单击菜单来编辑信号以自定义其参数:

../../../_images/visual_script30.png

您创建的信号将与内置节点信号一起出现在属性检查器中。这使您可以从另一个 场景节点 中的另一个脚本连接它:

../../../_images/visual_script31.png

最后,要发出信号,只需将其拖动到画布上:

../../../_images/visual_script32.png

请记住,发出信号是一种顺序操作,因此它必须来自序列端口。

添加更多节点

既然已经涵盖了基础知识,那么让我们讨论一下可用于画布的大量实用程序节点! 在成员面板下方,存在所有可用节点类型的列表:

../../../_images/visual_script33.png

Pressing Ctrl + F (or Cmd + F on macOS) allows you to search the list.

它们中的任何一个都可以拖到场景中。与节点不同(例如,从属性检查器中拖动属性会自动将上下文设置为在编辑的节点),这些节点的添加没有任何“上下文”信息,因此必须手动完成。

../../../_images/visual_script34.png

请记住,您可以检查类参考以了解每个节点的功能,因为在那里有文档记录。提到的,节点类型的简要概述如下:

常量

常量节点是提供值的节点,这些值虽然不随时间变化,但可用作参考值。大多数情况下它们是整数或浮点数。

../../../_images/visual_script36.png

第一个是 Constant,它允许您选择任何类型的任何值作为常量,从整数(42)到字符串(Hello!)。通常,由于 数据节点 中的默认输入值,通常不使用此节点,但知道它存在是很好的。

第二个是 GlobalConstant 节点,其中包含Godot中用于全局类型的一长串常量。在这里,您可以找到一些有用的常量来引用键名、操纵杆或鼠标按钮等。

第三个是 MathConstant,它提供典型的数学常数,如PI、E等。

数据

数据节点处理各种对信息的访问。Godot中的任何信息都可以通过这些节点进行访问,因此它们是一些最重要的节点,并且种类繁多。

../../../_images/visual_script37.png

这里有趣的节点有很多类型,因此下面将简要描述它们:

动作

在处理来自设备的输入时,动作节点至关重要。您可以在(@TODO ACTION TUTE LINK)中阅读有关动作的更多信息。在下面的示例中,当按下 move_right 动作时,控件将移动到右侧。

../../../_images/visual_script38.png

引擎单例(Singleton

引擎单例是全局接口(这意味着无需引用即可访问它们;与场景节点不同,它们始终可用)。它们有多种用途,但总的来说,它们对于低级访问或与操作系统相关的访问很有用。

../../../_images/visual_script39.png

请记住,将连接拖动到空白区域将有助于您调用以下函数或设置/获取属性:

../../../_images/visual_script40.png

局部变量

这些节点可以用作图形的临时存储。确保它们在使用时都具有相同的名称和类型,并且它们将引用相同的内存。

../../../_images/visual_script41.png

As it can be seen above, there are two nodes available: A simple getter, and a sequenced setter (setting requires a sequence port).

场景节点

这只是对树中节点的引用,但是通过将实际节点从场景树拖动到画布上(这将创建并配置它),将更易于使用此节点。

自身

在极少数情况下,可能需要将此场景节点作为参数传递。为此,可以调用函数并设置/获取属性,或将节点(或甚至具有脚本的节点本身)从场景树拖到画布上。

场景树

此节点类似于 Singleton 节点,因为它引用包含活动场景的 SceneTree。但是,SceneTree 仅在节点位于场景中并且处于活动状态时才起作用,否则访问它将返回一个错误。

SceneTree 允许许多低级别的事情,比如设置拉伸选项、调用编组、制作计时器、甚至加载另一个场景。这是一个适合熟悉的类。

预加载(Preload

这与GDScript中的 preload() 功能相同。它维护此资源已加载并可以使用。与实例化节点相比,将所需的资源从文件系统停靠面板拖到画布上更为简单。

资源路径

此节点是一个简单的帮助器,用于获取您选择的资源的路径的字符串。它在从磁盘加载东西的函数中很有用。

注释(Comment

Comment 节点用作可以调整大小以放置其他节点的节点。在选择它时,它不会试图获得焦点或被放到顶层。它也可以用来在上面写文字。

../../../_images/visual_script42.png

流控制

流控制节点通常根据给定条件,允许执行以采取不同的分支。

../../../_images/visual_script43.png

条件(Condition

This is a simple node that checks a bool port. If true, it will go via the "true" sequence port. If false, the second. After going for either of them, it goes via the "done" port. Leaving sequence ports disconnected is fine if not all of them are used.

迭代器(Iterator

Godot中的某些数据类型(即数组、字典)是可迭代的。这意味着可以为它具有的每个元素运行一些代码。

Iterator 节点遍历所有元素,并且对于每个元素,它通过 each 序列端口,从而使元素在 elem 数据端口中可用。

完成后,它将通过 exit 序列端口。

返回(Return

某些函数可以返回值。一般来说,对于虚函数,Godot会为您添加 Return 节点。返回节点强制函数结束。

序列(Sequence

此节点主要用于组织图形。它按顺序调用其序列端口。

类型转换(TypeCast

这是一个有用且常用的节点。您可以使用它将参数或其他对象转换为您想要的类型。之后,您甚至可以拖动对象输出以完全完成。

../../../_images/visual_script55.png

也可以转换为脚本,这将允许完整的脚本属性和功能:

../../../_images/visual_script54.png

选择(Switch

Switch 节点类似于 Condition 节点,但它同时匹配许多值。

While

这是一种更原始的迭代形式。只要满足 cond 数据端口中的条件,就会调用 重复 序列输出。

函数

函数是简单的帮助器,大多数情况下都是确定的。它们将一些参数作为输入并返回输出。它们几乎从未排序。

内置

有一个内置帮助器列表。该列表与 GDScript 中的列表几乎相同。它们中的大多数是数学函数,但其他函数可能是有用的帮助器。请确保一定要看一下清单。

按类型

这些是基本类型可用的方法。例如,如果您想要一个点积,您可以搜索 点(dot) 而不是 Vector3 类型。在大多数情况下,只需搜索节点列表即可,它应该更快。

调用(Call

这是通用调用节点。很少直接使用它,而是通过拖动到已配置的节点上的空白处。

构造函数

这些是创建Godot基本数据类型所需的所有函数。例如,如果需要从3个浮点数中创建一个 Vector3,则必须使用构造函数。

../../../_images/visual_script44.png

析构函数

这与构造函数相反,它允许将任何基本类型(即 Vector3)分离到子元素中。

../../../_images/visual_script45.png

发射信号

从任何物体发出信号。一般来说,这并不是很有用,因为拖动信号到画布的效果更好。

获取/设置

通用的 Getter/Setter 节点。从属性检查器中拖拽属性效果更好,因为在拖放时它们就被正确配置。

等待(Wait

Wait 节点将暂停执行函数直到发生某些事情(实际上,直到恢复,可以经过许多帧)。默认节点允许您等待经过一帧、一固定帧或给定的时间量,直到恢复执行为止。

避让(Yield

这个节点完全暂停脚本的执行,它将使函数返回一个值,该值可用于恢复执行。

Yield 信号

Yield 相同,但要等到一个给定的信号发出。

索引

通用索引操作符,不常用,但它的存在是好的,以防万一。

运算符

这些大多是通用运算符,例如加法、乘法、比较等。默认情况下,它们大多数都接受任何数据类型(如果输入的类型与运算符期望的类型不匹配,则在运行时将引发错误)。始终建议为运算符设置正确的类型,以更快地发现错误并使图形更易于阅读。

../../../_images/visual_script46.png

表达式(Expression)节点

在运算符中, Expression 节点是最强大的。如果使用得当,它可以极大地简化数学或逻辑繁重的可视化脚本。在上面键入的任何表达式,它将实时执行。

表达式节点可以:

  • 根据自定义输入,执行数学和逻辑表达式(例如: a*5+b,其中 ab 为自定义输入):
../../../_images/visual_script47.png
  • 访问局部变量或属性:
../../../_images/visual_script48.png
  • Use most of the existing built-in functions that are available to GDScript, such as sin(), cos(), print(), as well as constructors, such as Vector3(x, y, z), Rect2(...), etc.:
../../../_images/visual_script49.png
  • 调用API函数:
../../../_images/visual_script50.png
  • 使用顺序模式,这在遵守处理顺序的情况下更有意义:
../../../_images/visual_script51.png