导出器

Excel表格作为数据源和编辑器编辑好数据表后,我们需要导出生成Godot可以读取的文件。 在探索最适合Godot的数据表保存方案的过程中,我尝试并实现了以下几种保存方案。


导出器方案

导出器ID 导出器名称 Godot 3.x Godot 4.x C# 支持代码配置
GDS1.0 GodotScript 1.0 支持
GDS2.0 GodotScript 2.0 支持
RESOURCE Resource 不支持
JSON1.0 Json 不支持
JSON2.0 Json 不支持
C# CSharp 未开发 未开发 未开发 未开发

下面一一介绍这些导出器区别

GDS1.0 和 GDS2.0

这两个导出器是将Excel表格导出成GodotScript脚本类,这个类有个data字典变量,该变量里写满了表格里的数据。

如下所示

# GDS1.0
extends Reference
var None = null
var False = false
var True = true

var data = \
{1: {'array': [1, 2, 3, 4, 5], 'array_bool': [True, False], 'function': funcref(self,'function_1')...


static func function_1(args=[]):
    print(args)
# GDS2.0
extends RefCounted
var None = null
var False = false
var True = true

var data = \
{1: {'array': [1, 2, 3, 4, 5], 'array_bool': [True, False], 'function': Callable(self,'function_1')...


static func function_1(args=[]):
    print(args)

用GodotScript作为数据源的优点:

  1. GodotScript脚本除了是源码外,它也是游戏资源,因此直接将数据写到脚本里当数据源可以省略读文件再解析这一步。
  2. 由于是GodotScript脚本,因此编辑器也会发现其语法错误,也会在运行时准确发现数据的错误。
  3. GodotScript脚本的加载速度十分的快,比用FileAccess打开要快很多倍。
  4. 由于是脚本,因此Excel表中可以配置函数代码,如上面例子,function字段是代码。

Note

GDS1.0和GDS2.0导出器区别不是很大,主要是GodotScript1.0和GodotScript2.0里 Reference和Funcref两个类改名成了RefCounted和Callable,因此分开实现了两个导出器。

RESOURCE

这个导出器是以Godot Resource文件作为数据源。

[gd_resource type="Resource" script_class="EEDataTable" load_steps=2 format=3]

[ext_resource type="Script" path="res://Setting/dist/ee_data_table.gd" id="1"]

[resource]
script = ExtResource("1")
data = {1: {"array": [1, 2, 3, 4, 5], "array_bool": [true, false], ...

跟GDS的方案来讲没有什么优势,不支持配置代码,读取效率也很慢。

JSON1.0 和 JSON2.0

用json文本文件作为数据源,跟其他方案比起来,其他方案因为是Godot的资源,因此读和解析是Godot一条龙处理的,而json文本就需要settings.gd里写方法去读和解析。

json方案并没有什么优点,唯一的优点就是json文件打开来后是人类友好的,比较容易阅读的,其他格式都全生成到一行里了基本无法阅读。

{
  "1": {
    "id": 1,
    "int": 1,
    "float ": 1.0,
    "string": "恭喜你!成功配置好了Godot导表项目。",
    "bool": true,
    "array": [
      1,
      2,
      3,
      4,
      5
    ],
    "array_str": [
      "a",
      "b",
      "c"
    ],
    "array_bool": [
      true,
      false
    ],
    "dict": {
      "name": "Tom",
      "age": 10
    },
    "function": "print(args)"
  },...

Note

由于Godot4.0文件读写和JSON的接口发生变动,导致需要两个JSON导出器来分别对应Godot3.x和Godot4.x。


总结

推荐使用GDS1.0/GDS2.0导出器,因为Godot的资源文件读取效率比JSON高,而且GDS1.0/GDS2.0导出器支持配置代码。 目前暂时未支持C#项目用的数据文件。