HOME / 第 6 部分 · 数据与进阶开发 / 第 68 课
MODULE 6 · 数据与进阶开发
第 68 课 · 自定义资源(Resource)
🎯 本课学习目标
- 理解 Resource 与数据驱动
- 自定义 Resource 类
- 用资源做物品/敌人配置
把数据从代码里抽出来,做成「配置资源」,改配置不用改代码。本课掌握自定义资源。
📖 详细教学步骤
什么是 Resource?概念
Resource 是 Godot 的数据载体(图片、音频、材质都是资源)。自定义资源 = 定义自己的「数据结构」,还能在编辑器里可视化编辑。
好处:
- 物品/敌人/关卡做成资源,策划可直接配
- 数据与逻辑分离,代码更简洁
- 资源可复用、可继承
创建自定义资源类代码
新建脚本 item_data.gd,继承 Resource:
GDSCRIPTclass_name ItemData
extends Resource
@export var item_name: String = ""
@export var description: String = ""
@export var icon: Texture2D
@export var price: int = 0
@export var power: int = 1
@export var type: String = "weapon" # weapon / potion / key
创建资源实例操作
- 资源面板右键 → 新建资源(New Resource)
- 选择
ItemData(你的类名) - 在检查器填属性:名字、价格、图标等
- 保存为 sword.tres、potion.tres
💡 这就是「数据驱动」:物品数据全在资源文件里。
代码里使用资源代码
加载资源并使用:
GDSCRIPTextends Node
const SWORD = preload("res://data/items/sword.tres")
const POTION = preload("res://data/items/potion.tres")
var inventory: Array = []
func _ready():
inventory.append(SWORD)
inventory.append(POTION)
for item in inventory:
print(item.item_name, " 价格:", item.price)
资源数组与商店进阶
一组物品资源做成数组:
GDSCRIPT# shop.gd
@export var items: Array[ItemData] = [] # 检查器拖入多个资源
func show_shop():
for item in items:
print("出售:", item.item_name, " - ", item.price)
func buy(item: ItemData, gold: int) -> bool:
if gold >= item.price:
return true
return false
资源继承与子类进阶
资源也可以继承,扩展新类型:
GDSCRIPTclass_name WeaponData
extends ItemData
@export var damage: int = 10
@export var range: float = 2.0
class_name PotionData
extends ItemData
@export var heal_amount: int = 30
资源复用场景实操
搭配场景实例化:制作物品掉落时,用资源驱动:
GDSCRIPT# 掉落物生成(item.tscn + item_data 资源)
func spawn_item(data: ItemData, pos: Vector2):
var drop = item_scene.instantiate()
drop.item_data = data # 把资源赋给掉落物
drop.position = pos
add_child(drop)
⚠️
新建资源找不到我的类?
脚本里必须有 class_name 声明,且脚本已保存。可能需要在编辑器里重启/重新加载脚本。
⚠️
改资源没生效?
资源是引用:改 .tres 会同步到所有使用处。若是代码里 new 出来的,要重新赋值。
🧪 动手试一试
🏋️ 课后练习
用 ItemData 资源做 5 种商品(武器/药水/钥匙),做一个小商店 UI,金币够就买走并减钱。
自定义 Resource + 数组 + UI 列表渲染。
💡
资源驱动开发是专业项目标配,越早习惯越好。
💡
Resource 还可以存数组/字典/嵌套资源,功能很强大。
🎓 本课小结
自定义 Resource:class_name + extends Resource + @export 属性 → 编辑器里可视化建资源文件 → 代码 preload 使用;数据与逻辑分离。