Godot TSCN 文件格式

🟡 TSCN 文件格式
https://docs.godotengine.org/en/stable/development/file_formats/tscn.html
https://github.com/godotengine/godot/blob/master/scene/resources/resource_format_text.cpp
https://github.com/godotengine/godot/blob/master/core/variant_parser.cpp
godot-docs\development\file_formats\tscn.rst
godot\scene\resources\resource_format_text.cpp
godot\core\variant_parser.cpp
TSCN (text scene) 字符串格式场景文件,Godot 加载后会编译成二进制文件保存在 `.import/` 或工作目录,Godot 4.x 则保存在 `.godot/imported/`。
TSCN 文件有 5 个区段,分别开头表示注解:
0. File Descriptor - ``[gd_scene]``
1. External resources - ``[ext_resource]``
2. Internal resources - ``[sub_resource]``
3. Nodes - ``[node]``
4. Signal Connections - ``[connection]``
所有区段中使用的实体使用方括号包括,实体可以添加任意的 key="value" 键值对,实体后可以紧跟属性设置,使用 property=value 这样的格式书写。
Godot 4.x 使用的格式版本为 Version 3,使用字符串作为资源 ID、UID,与前一个版本不兼容:
- Version 2: changed names for Basis, AABB, Vectors, PoolVectors, etc.
- Version 3: new string ID for ext/subresources, and uid, breaks forward compat.
需要将 Godot 4.x 工程降级为低版本的 Godot 3.x 工程,则需要考虑类型名称变化、资源文件格式问题,还有新版本中 GDScript 关键字、注解功能的差别。手动降级 Godot 工程的操作步骤:
- 修改 project.godot 中的版本号,将新版本 config_version=5,旧版本 Godot 3.x 版本为 4;
- 修改场景文件中的版本号,改为 format=2;
- 删除场景中的 uid 属性,并重新设置实体的 id 属性,去掉双引号及字符串,直接使用一个唯一的数值;
- 相应地修改资源引用 SubResource(id) 或 ExtResource(id);
- 根据节点及数据类型修改 type 属性,更新相应的名称,以及结构;
- 更新 GDScript 脚本中关键字、注解的使用,同时修改类型名称;
例如,Godot 4.x 中的 RPC 标注与 Godt 3.5 中的关键字等价关系:
文件描述符号是场景文件的开头区段,定义场景文件的格式版本和加载步骤数:外部资源数量+场景文件本身。即使 load_steps 数值不正确,引擎还是会加载场景文件,但会影响使用这个值的代码。
除了外部资源,场景文件还可以内嵌资源,比如节点内嵌的脚本,分别使用 `ExtResource` 和 `SubResource` 引用 ID 指定的外部资源和内嵌资源。内嵌资源包括 meshes, materials, GDScript 等等数据。
比如以下场景文件,根节点引用了内嵌脚本资源,内嵌资源使用 [sub_resource] 实体定义,并通过资源属性 `script/source` 指定脚本源代码,代码按原样直接紧接资源属性的 = 后面,并使用双引号包括,源代码中的双引号和 \ 会被转义为 \" 和 \\:
节点和外部资源是场景树层次结构组织的基本方式,[ext_resource] 实体定义外部资源,[node] 定义节点。场景文件中第一个定义节点即为场景的根节点,子节点通过 parent 属性指定父级节点。
场景树中一些节点需要引用其它节点,场景文件中需要使用``NodePath(Path/To/Node)``来指定节点路径,比如,MeshInstance3D 中的骨架属性,需要使用``NodePath()``引用指定骨架节点。动画节点 Animation 也类似地使用``NodePath()``引用指定节点的属性:
此外,场景文件中还有其它许多不同的节点类型,及数据格式,参考 TSCN 文件格式文档。
源代码中定义了文本资源加载器,使用 is_scene 指示加载的是 TSCN 场景资源文件,即等同 [gd_scene]。
ResourceLoaderText::open() 负责打开文本资源文件,并通过 VariantParser::parse_tag() 解析资源文件中的实体定义。VariantParser::parse_value() 中定义了支持使用的数据类型: