在 GDScript 中组织复杂的库

问题描述 投票:0回答:1

我想在 GDScript 中构建一个可重用的库。当用我熟悉的其他语言(JavaScript 和 C#)构建库时,我通常会利用 GDScript 似乎没有的两个功能:

  1. 公共/私有函数明确定义公共API
  2. 将两个文件显式链接在一起(JS 中的导入,C# 中的类)

在GDScript中,(1)似乎是通过强调私有方法来解决的。虽然我发现这不如显式私有函数有用,但我确实找到了 Godot 提案,其中正在讨论添加此功能。

这个问题是围绕如何解决(2)的问题,它允许将大型且复杂的库分割成任意数量的文件。我能想到的两个选择是:

  1. 完全不要拆分库,将所有内容写入一个文件中。虽然这适用于简单的库,但它不能扩展到非常大的库。
  2. 使用基于
    class_names
    构建的命名约定将功能拆分为多个文件。例如,有一个脚本导出指定库的公共 API
    class_name
    。例如
    class_name MyLibrary
    。然后,其他文件将指定类名称,例如
    class_name MyLibrary_UtilA
    MyLibrary_UtilB
    等。该文档仅涉及
    MyLibrary
    ,希望用户不要修改内部结构。

我是否缺少任何更适合组织大型/复杂库的 GDScript 功能,或者这两个选项是最好的方法吗?

我现在正在从事的具体项目是一个大型库的端口,该库在 C# 或 JS 中可能会被分成大约 50 多个不同的文件。

gdscript organization lib modularity
1个回答
1
投票

是的,还有另一种方法,可能适合您。

您可以使用

preload
和相对路径来引用您的脚本。例如:

const MyClass := preload("my_class.gd")

然后您可以使用该常量作为类。例如:

var obj := MyClass.new()

这是因为:

  1. GDScript
    (这是一个
    Resource
    )的实例是GDScript类。也就是说,
    GDScript
    是一个元类。
  2. const
    preload
    都在解析过程中解析(即
    preload
    是一个常量表达式)。因此,与使用
    load
    不同,类型信息在编写代码时可用。

这样:

  1. 您不使用
    class_name
    ,因此不会污染全局名称空间。
  2. 您明确了解脚本的依赖关系。
  3. 如果您将所有文件保存到同一个文件夹中,则无需担心路径。另外,将所有内容保存在同一个文件夹中,可以轻松地将文件夹复制到不同的位置(例如复制到不同的项目)。
© www.soinside.com 2019 - 2024. All rights reserved.