Godot 数据资源
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/godot-resources-sh-j4frb8。
技能介绍
要解决的问题
在 Godot 项目里,最常见也最隐蔽的一类技术债是把数据写死在代码里。例如一个剑士的攻击力写在 _ready() 里,一个对话脚本里塞满了条件分支,或者敌人数值散落在各个脚本的局部常量中。每次数值调整都要改代码、走完整编译流程,策划和程序之间的协作边界也因此模糊。
更棘手的问题是运行时数据无法持久化。你在编辑器里手动配好的物品表,一打包发布就消失殆尽。想让数据资产像代码一样进入版本控制、可被 diff、可被多人协作编辑,靠散装常量是做不到的。
这个技能如何工作
这个技能的核心思路是:把游戏数据建模为 Godot 4.3+ 中的 Resource 子类,而不是硬编码值。
- 用
class_name和@export定义数据类:一旦声明了class_name,这个类就会出现在编辑器的 "New Resource" 对话框里,同时能作为@export的类型被其他节点直接引用,在 Inspector 中可视化编辑。 - 实例化为
.tres或.res文件:.tres是纯文本格式,天然适合 diff 和版本控制;.res是二进制格式,体积更小、加载更快。创建后直接在 Inspector 里填字段,不需要写一行代码。 - 通过
@export引用到节点:比如@export var data: ItemResource,或者@export var loot: Array[ItemResource]。节点就变成了资源的消费者,而非数据的持有者。 - 运行时加载:常量路径用
preload(编译期加载),变量路径用load或ResourceLoader.load。大资源可以用load_threaded_request做后台加载。 - 保存与修改:运行时生成或编辑的资源通过
ResourceSaver.save落盘。
适用边界与注意点
- 资源是引用共享的:同一个
.tres被多个节点使用时,它们持有的是同一个对象。运行时修改它会影响所有节点,并且可能覆盖编辑器里的原始文件。需要隔离状态时,先duplicate(true)。 class_name是必须的:缺少它,类不会出现在编辑器的新建资源对话框中,也无法作为@export类型使用。res://是只读的:打包后的游戏无法写入res://,运行时数据要写到user://下。编辑器里可以保存到res://仅限开发时。- 不要把节点直接存进 Resource:Resource 序列化的是数据,不是场景节点。需要引用场景时应该用
PackedScene。 - 避免循环引用:A 持有 B、B 又持有 A 的结构在保存/加载时容易出错,应该用 ID 查找来解耦。
- 不要在
.tres里放秘密信息:导出包中它是明文可见的。 - 区分场景结构与数据资源:本技能只处理数据层面的 Resource,节点/场景的实例化与组织请用
godot-nodes-scenes;运行时存档与读档用save-systems。
使用场景
- 为 RPG 中的武器、防具、消耗品建立属性数据表,所有数值以 .tres 形式存放在 FileSystem 中,避免在脚本里散落常量。
- 对话系统需要用数据驱动而非硬编码 if-else,对话内容以 Resource 实例保存,方便 diff 和多人协作编辑。
- 运行时根据玩家行为生成或修改怪物掉落表后,需要将其序列化保存到 user:// 目录而非只读的 res://。
- 关卡中的敌人配置(血量、AI 参数、掉落列表)需要作为 Inspector 可编辑的数据资源,多个节点共享引用但运行时需独立修改。
适合人员
- 独立游戏开发者:负责从代码到数值的全栈工作,需要一种无需写代码即可配置游戏数据的方式。
- 游戏策划或关卡设计师:希望在不修改脚本或等待编译的情况下,直接在 Inspector 中调整数值并保存。
- 使用 C# 的 Godot 开发者:需要了解如何在 Godot 4.x C# 侧实现类似 Resource 的数据建模与序列化。