我在解释 godot 引擎 gdscript 文件的实用程序时遇到了一点麻烦。我在网上搜索了一下,发现一个 gdscript 文件是一个类,这个类继承自我附加到的节点。然而,我的问题是gdscript类文件是一个用于在某种意义上"初始化"对象/节点的文件,例如,在Java等纯面向对象的语言中,当我在"main"中定义一个对象时,我通过构造函数初始化它?
为了保持稳定,当我说GDScript时,我说的是语言,当我说GDScript
时,我说的是这样称呼的Godot类。
a gdscript 文件是一个类
正确。
好吧,文件就是文件,是文件,是文件。但是 GDScript 脚本是类,它们从 gd 文件加载并保存到 gd 文件中。因此,说 gd 文件是一个类是一个很好的速记。
这个类继承自我附加到的节点
您可以在脚本中指定它扩展的类。哪个可能是也可能不是Node
的子类。如果要将脚本附加到Node
,则必须扩展Node
的类。
gdscript 类文件是用于在某种意义上"初始化"对象/节点的文件,例如,在纯面向对象语言(如 Java)中,当我在"main"中定义一个对象时,我通过构造函数初始化它?
可以在 GDScript 中使用的类可以是内置类(在 Godot 源代码中定义,顺便说一下,这是C++),也可以是用某种脚本语言(包括 GDScript)定义的类。
在运行时在 GDScript 中定义的类将是GDScript
类的实例,这些类是从 gd 文件加载并保存到 gd 文件的Resource
。
GDScript
类是其他语言所说的元类。也就是说,GDScript
类(GDScript
对象)的实例是类。
一般来说,a类的实例是一个对象(在Godot,Java或其他什么中)。
Godot 类扩展了Object
类,因此它们的实例Object
s。
如果类扩展Node
(扩展Object
),则类的实例Node
s。但是脚本不必扩展Node
。例如,创建扩展Resource
的自定义类很有用(即定义自定义Resource
类型很有用)。
是的,类有构造函数。在Godot类中,公开了一个名为new
的静态方法,用于创建实例,调用它会导致对构造函数的调用。然后重写虚拟方法_init
为构造函数提供自定义行为。如果要拆分头发,_init
方法在技术上是一个初始值设定项,而不是构造函数,但我们无论如何都会称它为构造函数。在 GDScript 中,不能定义其他构造函数。
您可能还对通常用于初始化的_ready
方法感兴趣,但该机制与场景树相关,而不是与类相关。
如果我们从你做什么和会发生什么的角度来考虑它,也许你会更好地理解这一点。
在项目中创建新的 gd 文件。Godot 将尝试将此 gd 文件加载为GDScript
实例。为此,GDScript
的资源加载器将创建一个新的GDScript
实例并提供代码(它从打开 gd 文件、读取它中获得的代码),然后让GDScript
实例解析它。这可能会失败,从而导致某些错误输出,或者不会。
执行游戏时,它将执行相同的操作(除了 gd 文件的资源路径可能会解析为读取导出版本中的打包资源)。
现在,一旦您有了GDScript
实例,您就可以对其调用new
。这将根据脚本创建一个新Object
,设置其方法和属性,初始化它们并执行_init
。
好的,但您可能不是在处理GDScript
实例,而是使用命名类。因此,在解析和执行代码时,Godot 需要能够将类的名称解析为脚本类或内置类......因此,戈多保留了将类名映射到类的字典。您可以使用class_name
关键字为 GDScript 中定义的类命名。
现在,我说过,当您在GDScript
实例上调用new
时,它将根据脚本创建一个新Object
。这意味着它将查找脚本所说的扩展的类并创建该类的实例。
特别是,如果我们谈论的是一个扩展Node
的类(或其某个子类),Godot 将创建一个实例Node
(或相应的子类),将GDScript
实例本身附加到这个新的Node
实例,然后分配脚本定义的变量并将它们设置为默认值,发出"script_changed"
信号, 并打电话给_init
.
顺便说一下,我们还没有谈论场景。如果您想了解更多信息,我将链接您之前的一些答案:
- 节点和对象
- 场景实例化
- 就绪机制