在 Godot 中编写场景脚本

17 Mar 2025 | 5 分钟阅读

我们将设置一个包含按钮和标签的 GUI 场景,按下按钮将更新标签。 这将演示

  • 编写脚本并将其附加到任何节点。
  • 我们将通过信号连接 UI 元素。
  • 我们正在编写一个可以访问视图中其他节点的脚本。

在继续之前,请务必阅读 GDScript 参考。 这是一种旨在简单的语言,文本很短,因此只需几分钟即可概述这些概念。

场景设置

使用“添加子节点”对话框(可通过“场景”选项卡访问或按 ctrl+A)创建具有给定节点的层次结构

  • Panel
    • 标签
    • Button (按钮)

场景树如下所示

Scripting scene in Godot

使用 2D 编辑器 调整按钮和标签的大小和位置,使其看起来像下图。 我们可以从检查器选项卡设置文本。

Scripting scene in Godot

最后,我们必须使用诸如 sayhello.tscn 之类的名称保存场景。

添加脚本

右键单击面板节点,然后从上下文菜单中选择“附加脚本

Scripting scene in Godot

将弹出脚本创建对话框。 此对话框允许我们设置类名、脚本的语言和其他适用的选项。

在 GDScript 中,文件本身代表类,因此类名字段不可编辑。

我们将脚本与面板相关联,因此 legacy 字段将自动填充“panels”。 这是我们想要的,因为脚本的目的是扩展我们的面板节点的功能。

最后,输入脚本的路径名并选择创建;

Scripting scene in Godot

脚本将被创建添加到节点。 我们可以在“场景”选项卡中的节点旁边以及检查器下的脚本选项卡属性中看到一个“OpenScript”图标

Scripting scene in Godot

要编辑任何脚本,请选择以上图片中突出显示的这两个按钮中的任何一个。 这会将我们带到脚本编辑器,其中可以包含默认模板

Scripting scene in Godot

当节点及其子节点进入活动场景时,将调用 _ready() 函数。

注意: -ready() 不是构造函数,而是 _init()。

脚本的角色

脚本为节点添加行为。 它用于控制节点的工作方式以及它与其他节点(子节点、父节点、兄弟节点等)的交互方式。 脚本的局部区域是节点。 换句话说,脚本节点提供的功能是继承的。

Scripting scene in Godot

处理信号

当发生一些 特定 类型的动作时,信号会被“发出”,它们可以与任何实例的任何函数相关联。 信号主要用于 GUI 节点,尽管其他节点也具有信号,我们也可以在脚本中定义自定义信号。

在此步骤中,我们将“抑制”信号连接到自定义函数。 创建连接是第一部分,定义自定义函数是第一部分的第二部分。 Godot 提供了两种构建链接的方式:通过可视化界面、通过编辑器提供或代码。

虽然我们在本教程系列的剩余部分中使用代码方法,但让我们介绍一下编辑器界面的工作方式,以供将来参考。

在视图树中选择按钮节点,然后选择“节点”选项卡。 接下来,确保我们选择了“信号”。

Scripting scene in Godot

如果我们然后选择“BaseButton”下的“pressed()”并单击右下角的“连接..”按钮,我们将打开连接创建对话框。

Scripting scene in Godot

在左下方是我们需要创建连接的关键内容:一个实现我们要触发的方法的节点(此处表示为 NodePath)以及触发方式的名称。

左上角部分显示了我们场景的节点列表,其中突出显示了红色发射节点的名称。 在此处选择“Panel”节点。
当我们选择一个节点时,底部的节点路径将自动更新,以指向从释放节点到所选节点的相对路径。

默认情况下,该方法包含发射节点的名称(在本例中为“button”),从而产生“_on_[EmitterNode]_[signal_name]"。 如果我们选中了“创建函数”复选框,则编辑器将为我们生成函数以设置连接。

到此结束了关于如何使用可视化界面的指南。 但是,这是一个脚本编写教程,因此为了学习,让我们深入了解手动过程!

完成此操作后,我们将介绍 Godot 程序员最常用的一个函数:Node.get_node ()。 此函数使用路径来获取相对于脚本拥有的节点的任何位置的节点。

为方便起见,删除展开面板下方的所有内容。 我们将手动填写脚本的其余部分。

由于面板底部的按钮标签是附加脚本的兄弟节点,因此我们已经可以通过在 _() 下键入来调用该按钮了

GDScript
func _ready():
    get_node("Button")

Next, write a function which is called when the button is pressed:
GDScript
func _on_Button_pressed():
    get_node("Label").text = "HELLO!"

Lastly, connect the button's "pressed" signal to _ready() by using Object.connect().
GDScript
func _ready():
    get_node("Button").connect("pressed", self, "_on_Button_pressed")

The final script should look like this:
GDScript
extends Panel

func _ready():
    get_node("Button").connect("pressed", self, "_on_Button_pressed")

func _on_Button_pressed():
    get_node("Label").text = "HELLO!"

运行场景并按下按钮。 我们应该得到以下结果

Scripting scene in Godot

你好! 恭喜你编写了我们的第一个场景。

注意:关于本教程的一个常见误解是 get_node (PATH) 的工作方式。 对于节点,get_node (PATH) 搜索其直接子节点。 在上面的代码中,这意味着该按钮必须是 Panel 的子节点。 如果开关改为标签的子节点,则获取它的代码将是;

GDScript
# Not for this case,
# but in case.
get_node("Label/Button")

另外,请记住,节点是通过名称而不是类型引用的。

注意
“连接”对话框的右侧面板旨在将特定值绑定到连接函数的参数。 我们可以添加和删除多种类型的值。
代码方法也可以使用 4A 数组参数来实现,该参数默认情况下为空。 随意阅读对象。 连接该方法以获取更多信息。


下一个主题GDScript 简介