本文概述
我们将建立一个包含按钮和标签的GUI场景, 按此按钮将更新标签。它将演示:
- 编写脚本并将其附加到任何节点。
- 我们正在通过信号连接UI元素。
- 我们正在编写一个可以访问视图中其他节点的脚本。
在继续之前, 请确保阅读GDScript参考。它是一种设计简单的语言, 并且文本简短, 因此概述概念所需的时间不会超过几分钟。
场景设定
使用”场景”选项卡(或按ctrl + A)访问的”添加子节点”对话框来创建具有给定节点的层次结构:
- 面板
- 标签
- 纽扣
场景树如下所示:
使用2D编辑器调整按钮和标签的大小和位置, 使其看起来像下面的图像。我们可以从检查器选项卡设置文本。
最后, 我们必须使用诸如sayhello.tscn之类的名称保存场景。
添加脚本
右键单击面板节点, 然后从上下文菜单中选择”附加脚本”:
脚本创建对话框将弹出。此对话框使我们可以设置类名称, 脚本语言和其他适用的选项。
在GDScript中, 该文件表示类本身, 因此类名称字段不可编辑。
我们与脚本关联的节点是一个面板, 因此旧版字段将自动填充”面板”。这就是我们想要的, 因为脚本的目的是扩展面板节点的功能。
最后, 输入脚本的路径名, 然后选择创建。
将创建脚本并将其添加到节点。我们可以在”场景”选项卡中的节点旁边以及检查器下方的”脚本”选项卡属性中看到类似” OpenScript”图标的图标:
要编辑任何脚本, 请选择这两个按钮中的任何一个, 这些按钮在上图中突出显示。这将带我们到脚本编辑器, 其中可以包含默认模板:
当节点及其子节点进入活动场景时, 将调用_ready()函数。
注意:-ready()不是构造函数, 而是_init()。
脚本的作用
脚本将行为添加到节点。它用于控制节点的工作方式以及与其他节点(子代, 父母, 兄弟姐妹等)的交互方式。脚本的本地区域是节点。换句话说, 脚本节点提供的功能是继承的。
处理信号
当某种特定类型的动作发生时, 信号被”发出”, 并且它们可以与任何实例的任何功能相关联。信号主要用于GUI节点, 尽管其他节点也有信号, 我们也可以在脚本中定义自定义信号。
在此步骤中, 我们将”抑制”信号连接到自定义功能。创建连接是第一部分, 定义自定义功能是第一部分的第二部分。 Godot提供了两种建立链接的方式:通过可视界面, 通过编辑器商品或代码。
在本系列教程的其余部分中使用代码方法时, 让我们介绍一下编辑器界面的工作方式, 以备将来参考。
在视图树中选择按钮节点, 然后选择”节点”选项卡。接下来, 确保我们选择了”信号”。
如果然后在” BaseButton”下选择” pressed()”并单击右下角的” Connect ..”按钮, 将打开连接创建对话框。
左下方是创建连接所需的关键内容:一个实现我们要触发的方法的节点(在此表示为NodePath)以及触发方式的名称。
左上部分显示场景节点的列表, 并以红色突出显示发射节点的名称。在此处选择”面板”节点。
当我们选择一个节点时, 底部的节点路径将自动更新, 以指示从释放节点到所选节点的相对路径。
默认情况下, 该方法包含发射节点的名称(在这种情况下为”按钮”), 结果为” _on_ [EmitterNode] _ [signal_name]”。如果我们确实选中了” Make function”复选框, 那么编辑器将为我们建立连接建立函数。
并总结了有关如何使用可视界面的指南。但是, 这是一个脚本教程, 因此, 为了学习, 让我们深入研究手动过程!
完成此操作后, 我们将介绍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!"
运行场景并按按钮。我们应该得到以下结果:
为什么在那里!恭喜你编写了第一个场景脚本。
注意:关于本教程的一个常见误解是get_node(PATH)的工作方式。对于节点, get_node(PATH)搜索其直接子节点。在上面的代码中, 这意味着该按钮必须是Panel的子级。如果该开关是该标签的子代, 则获取该代码的代码将是;
GDScript
# Not for this case, # but in case.
get_node("Label/Button")
另外, 请记住, 节点是通过名称而不是类型来引用的。
评论前必须登录!
注册