节点与术语
在继续之前,必须注意节点这个术语需要谨慎使用。当指代Visual Script 节点(也称节点)时,此文本将指代用线连接的小盒子,它们是图的一部分。当指代场景节点时,它的意思的是构成场景的元素,是树的一部分。它们的命名类似,但是功能不同。除非另有说明,否则此处的节点指的是 Visual Script 节点。
节点属性
与大多数可视化脚本实现一样, 每个节点都具有可编辑的属性. 但是, 在Godot中, 为了便于阅读, 我们尽量避免使用可编辑的控件来复杂化节点.
节点仍将所需信息显示为文本,但编辑是通过检查器完成的。要编辑它们,请选择任何节点并在检查器中编辑其属性。
端口和连接
Godot 可视化脚本中的编程是通过节点和每个函数内的端口连接完成的。
端口
Godot 可视脚本中的节点具有端口。这些端点出现在节点的左侧和右侧,并可用于建立连接:端口有两种类型:序列和数据。
序列端口 指示执行操作的顺序. 通常, 当一个 节点 完成处理后, 它将从右侧的端口之一转到下一个节点. 如果未连接任何内容, 则该函数可能会终止, 或者可能尝试另一个输出 序列端口 (取决于节点). 因此, 您可以遵循白线来遵循函数中的逻辑流程. 并非每个 节点 都有 序列端口. 实际上, 大多数都没有.
数据端口 端口包含类型化的值. 类型可以是任何常规Godot类型, 例如布尔, 整数, 字符串, Vector3, 数组, 任何对象或场景节点等. 节点右侧的 数据端口 被视为输出, 而左侧的端口是输入. 连接它们可以使信息流动到下一个节点.
但并非所有的 数据端口 类型都兼容并且允许连接. 要特别注意颜色和图标, 因为每种类型都有不同的表示形式:
连接
连接是一个相对简单的过程。将输出端口拖向输入端口。
断开连接需要一点练习. 在 数据端口 断开是通过拖走 输入 来实现的, 而对于 序列端口, 则通过拖走 输出 来实现.
乍一看这很奇怪, 但是发生的原因是 数据端口 为 1:N
(单个输出端口可以连接到许多输入), 而 序列端口 为 N:1
(许多序列输出可以连接到单个输入).
连接到空白区域(拖动以进行连接, 但在空白区域上未按下)也是上下文相关的, 它将提供最常用操作的列表. 对序列, 它将是条件节点:
而对于数据, 将打开上下文设置/获取/调用菜单:
添加节点
最后!我们到了有趣的部分!但是, 在更详细地解释每种类型节点的作用之前, 让我们简单地看一下最常添加和处理节点的方式.
访问场景节点
最常见的任务之一是访问场景树节点(同样,不要与 Visual Script 节点混淆)。从场景树中拖放到画布上,将要求你在此节点上调用方法(有时称为成员函数)。
虽然在大多数情况下都需要访问属性(在下面进行更多介绍), 但有时 调用方法 也可能有用. 方法对对象执行特定的操作. 在上述情况下, 可以将鼠标指针映射到控件的局部坐标中. 另一个常见用例是使用 queue_free
方法对要删除的节点进行排队.
必须注意,仅当正在编辑的场景在其中一个节点中包含你的 Visual Script 时,这才起作用!否则,将出现一个警告。
访问场景节点属性
这是在可视化脚本中编辑场景节点的最常用方法。从场景树中选择 场景节点,转到“检查器”,找到要编辑的属性的 名称(提示,不是值!)并将其拖到画布上:
结果是可以通过写入 数据端口 从脚本中更改此值.
如果需要读取该值, 请再次拖动该节点, 但按住 Ctrl 键(macOS Cmd). 这将创建一个 getter
:
在这种情况下, 可以从 数据端口 读取值.
变量
变量是脚本本地的, 可以保存值的内存容器. 可以通过上一步中描述的方法从脚本的任何函数或从其他脚本中读取此值.
要添加变量, 请按成员面板的 变量 部分中的 +
按钮. 双击新变量以重命名它:
右键单击该变量可以配置其属性:
如上所示,变量的类型、初始值,以及一些属性提示都是可以修改的。选择“导出”选项会在选择节点时使“检查器”中的变量可见。通过上一步中描述的方法,这也使其可用于其他脚本。
要在脚本中使用该变量, 只需将其拖到画布上即可创建一个 getter
:
同样, 按住 Ctrl ( 或者在macOS上按住 Cmd )放置一个 setter
:
信号
也可以在脚本中创建自己的信号并使用它们. 为此, 除了 信号 之外, 执行与上一步中的变量相同的步骤:
也可以通过右键单击菜单来编辑信号以自定义其参数:
您创建的信号将与内置节点信号一起出现在检查器中。这使您可以从另一个场景节点中的另一个脚本连接它:
最后, 要发出信号, 只需将其拖动到画布上:
请记住, 发出信号是一种顺序操作, 因此它必须来自序列端口.
添加更多节点
既然已经涵盖了基础知识, 那么让我们讨论一下可用于画布的大量实用程序节点! 在成员面板下方, 存在所有可用节点类型的列表:
按下 Ctrl + F (或macOS Cmd + F ) 打开搜索列表.
它们中的任何一个都可以拖到场景中。与节点不同(例如,从检查器中拖动属性会自动将上下文设置为在编辑的节点),这些节点的添加没有任何“上下文”信息,因此必须手动完成。
请记住, 你可以检查类参考以了解每个节点的功能, 因为在那里有文档记录. 提到的, 节点类型的简要概述如下:
常量
常量节点是提供值的节点, 这些值虽然不随时间变化, 但可用作参考值. 大多数情况下它们是整数或浮点数.
第一个是 Constant
, 它允许您选择任何类型的任何值作为常量, 从整数(42
)到字符串(Hello!
). 通常, 由于 数据节点 中的默认输入值, 通常不使用此节点, 但知道它存在是很好的.
第二个是 GlobalConstant
节点, 其中包含Godot中用于全局类型的一长串常量. 在这里, 你可以找到一些有用的常量来引用键名, 手柄或鼠标按钮等.
第三个是 MathConstant
, 它提供典型的数学常数, 如PI, E等.
数据
数据节点处理各种对信息的访问.Godot中的任何信息都可以通过这些节点进行访问, 因此它们是一些最重要的节点, 并且种类繁多.
这里有趣的节点有很多类型, 因此下面将简要描述它们:
动作
在处理来自设备的输入时, 动作节点至关重要. 你可以在(@TODO ACTION TUTE LINK)中阅读有关动作的更多信息. 在下面的示例中, 当按下 move_right
动作时, 控件将移动到右侧.
引擎单例(Singleton
)
引擎单例是全局接口(这意味着无需引用即可访问它们;与场景节点不同, 它们始终可用). 它们有多种用途, 但总的来说, 它们对于低级访问或与操作系统相关的访问很有用.
请记住, 将连接拖动到空白区域将有助于你调用以下函数或设置/获取属性:
局部变量
这些节点可以用作图形的临时存储. 确保它们在使用时都具有相同的名称和类型, 并且它们将引用相同的内存.
从上面可以看到, 有两个可用的节点: 一个简单的 getter
和一个左侧有序列端口的 setter
(设置需要一个序列端口).
场景节点
这只是对树中节点的引用, 但是通过将实际节点从场景树拖动到画布上(这将创建并配置它), 将更易于使用此节点.
仅自己
在极少数情况下, 可能需要将此场景节点作为参数传递. 为此, 可以调用函数并设置/获取属性, 或将节点(或甚至具有脚本的节点本身)从场景树拖到画布上.
SceneTree
此节点类似于 Singleton
节点, 因为它引用包含活动场景的 SceneTree
. 但是, SceneTree
仅在节点位于场景中并且处于活动状态时才起作用, 否则访问它将返回一个错误.
SceneTree
允许许多低级别的事情, 比如设置拉伸选项, 调用编组, 制作计时器, 甚至加载另一个场景. 这是一个适合熟悉的类.
预加载(Preload
)
这与GDScript中的 preload()
功能相同. 它维护此资源已加载并可以使用. 与实例化节点相比, 将所需的资源从文件系统停靠面板拖到画布上更为简单.
资源路径
此节点是一个简单的帮助器, 用于获取你选择的资源的路径的字符串. 它在从磁盘加载东西的函数中很有用.
注释(Comment
)
Comment
节点用作可以调整大小以放置其他节点的节点. 在选择它时, 它不会试图获得焦点或被放到顶层. 它也可以用来在上面写文字.
流控制
流控制节点通常根据给定条件, 允许执行以采取不同的分支.
条件(Condition
)
这是一个检查布尔端口的简单节点. 如果为 true
, 它将执行 true
序列端口. 如果为 false
, 则执行第二个. 在执行完上面两个端口中的任意一个时, 会执行 done
端口. 对没有使用的端口保持断开即可.
迭代器(Iterator
)
Godot中的某些数据类型(即数组, 字典)是可迭代的. 这意味着可以为它具有的每个元素运行一些代码.
Iterator 节点遍历所有元素,并且对于每个元素,它通过“each”序列端口,从而使元素在“elem”数据端口中可用。
完成后,它将通过“exit”序列端口。
返回(Return
)
某些函数可以返回值. 一般来说, 对于虚函数,Godot会为你添加 Return
节点. 返回节点强制函数结束.
序列(Sequence
)
此节点主要用于组织图形. 它按顺序调用其序列端口.
类型转换(TypeCast
)
这是一个有用且常用的节点. 您可以使用它将参数或其他对象转换为您想要的类型. 之后, 您甚至可以拖动对象输出以完全完成.
也可以转换为脚本, 这将允许完整的脚本属性和功能:
选择(Switch
)
Switch
节点类似于 Condition
节点, 但它同时匹配许多值.
While
这是一种更原始的迭代形式. 只要满足 cond
数据端口中的条件, 就会调用 重复
序列输出.
函数
函数是简单的帮助器, 大多数情况下都是确定的. 它们将一些参数作为输入并返回输出. 它们几乎从未排序.
内置
有一个内置帮助器列表. 该列表与 GDScript 中的列表几乎相同. 它们中的大多数是数学函数, 但其他函数可能是有用的帮助器. 请确保一定要看一下清单.
按类型
这些是基本类型可用的方法. 例如, 如果你想要一个点积, 你可以搜索 点(dot)
而不是 Vector3
类型. 在大多数情况下, 只需搜索节点列表即可, 它应该更快.
调用(Call
)
这是通用调用节点. 很少直接使用它, 而是通过拖动到已配置的节点上的空白处.
构造函数
这些是创建Godot基本数据类型所需的所有函数. 例如, 如果需要从3个浮点数中创建一个 Vector3
, 则必须使用构造函数.
析构函数
这与构造函数相反, 它允许将任何基本类型(即 Vector3
)分离到子元素中.
发射信号
从任何物体发出信号. 一般来说, 这并不是很有用, 因为拖动信号到画布的效果更好.
获取/设置
通用的 Getter/Setter
节点。从检查器中拖拽属性效果更好,因为在拖放时它们就被正确配置。
等待(Wait
)
Wait
节点将暂停执行函数直到发生某些事情(实际上, 直到恢复, 可以经过许多帧). 默认节点允许你等待经过一帧, 一固定帧或给定的时间量, 直到恢复执行为止.
Yield
这个节点完全暂停脚本的执行, 它将使函数返回一个值, 该值可用于恢复执行.
Yield 信号
与 Yield
相同, 但要等到一个给定的信号发出.
索引
通用索引操作符, 不常用, 但它的存在是好的, 以防万一.
运算符
这些大多是通用运算符, 例如加法, 乘法, 比较等. 默认情况下, 它们大多数都接受任何数据类型(如果输入的类型与运算符期望的类型不匹配, 则在运行时将引发错误). 始终建议为运算符设置正确的类型, 以更快地发现错误并使图形更易于阅读.
表达式节点
Expression 节点是所有操作符中最强大的。如果使用得当,它可以极大地简化数学或逻辑繁重的可视化脚本。在上面键入的任何表达式,它将实时执行。
表达式节点可以:
- 根据自定义输入, 执行数学和逻辑表达式(例如:
a*5+b
, 其中a
和b
为自定义输入):
- 访问局部变量或属性:
- 使用GDScript现有的大部分内置函数, 例如
sin()
,cos()
,print()
, 以及构造函数, 例如Vector3(x,y,z)
,Rect2(..)
等:
- 调用API函数:
- 使用顺序模式, 这在遵守处理顺序的情况下更有意义: