gdscript(godot engine)文件用于初始化节点



我在解释 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类,因此它们的实例Objects。

如果类扩展Node(扩展Object),则类的实例Nodes。但是脚本不必扩展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.


顺便说一下,我们还没有谈论场景。如果您想了解更多信息,我将链接您之前的一些答案:

  • 节点和对象
  • 场景实例化
  • 就绪机制

最新更新