首页 > 解决方案 > 如何在 godot 中使用不同的脚本执行其他脚本?

问题描述

于是我在godot中做了这个简单的游戏,并且成功制作了一个开始菜单。但是,我希望开始菜单中的按钮实际执行其他脚本。我已经知道如何向按钮添加功能,我所需要的只是如何使用 godot 中的不同脚本执行另一个脚本。

如果您仍然不明白我的意思,请查看以下 python 代码:

exec(open("file.py").read())

我基本上想在 gdscript 中做类似的事情。

标签: execgodotgdscript

解决方案


首先,GDScript 没有顶级语句。好吧,至少本身不是(它具有顶级变量声明 - 也就是字段/属性 - 带有初始化程序)。这意味着您要执行的任何 GDScript 都必须在方法中。让我换一种说法:您不执行 GDScript 脚本。您执行 GDScript 脚本中的 GDScript 方法。

其次,当一个按钮被按下时,它会发送一个"pressed"信号(其他系统会称之为事件或通知)。无论您想在按下按钮时执行什么,都希望将其放入连接到信号的方法中(其他系统将其称为事件侦听器或处理程序)。

通常,您会将信号连接到脚本中的方法,该脚本附加到场景树中的节点。


您可以从编辑器连接信号,在节点面板 -> 信号选项卡中,您将找到所选节点的信号。从那里您可以将它们连接到同一场景中附加了脚本的任何节点。因此,您应该事先在要将信号连接到的节点上附加一个脚本。

一旦你告诉 Godot 连接一个信号,它会要求你选择你将连接它的节点,并允许你指定将处理它的方法的名称(默认生成一个名称)。也可以从代码连接信号。

请参阅信号


并且从连接的方法中,您可以调用您需要的任何其他内容。例如,您可以在其他脚本中调用静态方法;在自动加载(单例)中调用脚本;加载一个脚本,实例化它,并在实例上调用一个方法;评估代码;调用其他一些可执行文件……如果这是您对其中之一感兴趣的事情之一,请澄清。


附录:因为该示例将加载脚本。这是一个例子:

var script := load("res://script.gd")
script.static_method_name()
var instance = script.new()
instance.method_name()

附录 2:Sineexec获取源代码,让我们也看一个例子:

var file := File.new()
file.open("res://script.gd", File.READ)
var source_code := file.get_as_text()
var script := GDScript.new()
script.source_code = source_code
script.reload()
script.static_method_name()
var instance := script.new()
instance.method_name()

对于那些只是跳到示例进行复制和粘贴的人:上面的示例不是 GDScript 中常用的处理方式。

附录 3

如果您要多次引用一个脚本,请不要每次都加载它。而是preload在您需要它的脚本开头使用 const :

const ClassName := preload("res://script.gd")

或者更好的是,而不是加载或预加载脚本。转到另一个脚本,并class_name在文件开头给它一个类名,如下所示:

class_name ClassName

然后,在你需要的地方,你可以这样做:

ClassName.static_method_name()
var instance = ClassName.new()
instance.method_name()

这就是惯用的戈多。诚然,File上面显示的用于加载脚本的方法可能是改装系统的基础。


重申一下,您需要连接"pressed"按钮的信号,以便 Godot 知道按下按钮时要调用什么。通常,您会将信号连接到附加到场景节点的脚本。


推荐阅读