Loading...
Loading...
Design data-driven Godot 4.x games with custom Resource classes: define typed data with class_name + @export, save/load .tres/.res files, instance and duplicate resources, and load on demand with ResourceLoader (incl. threaded loading). Use when modeling items/stats/configs as data in a Godot project, creating .tres resources, or working with custom Resource subclasses and ResourceLoader/ResourceSaver.
npx skill4agent add gamedev-skills/awesome-gamedev-agent-skills godot-resourcesResource.tres.res.tresgodot-nodes-scenessave-systemsgodot-csharpResourceclass_name@export@export.tres.res@export var data: ItemResource@export var loot: Array[ItemResource]preloadloadResourceLoader.loadResourceSaver.save# item.gd
extends Resource
class_name ItemResource
@export var id: StringName = &""
@export var display_name: String = "Item"
@export_multiline var description: String = ""
@export var icon: Texture2D
@export var max_stack: int = 99
@export var value: int = 0sword.tresextends Node
@export var starting_items: Array[ItemResource] = [] # drag .tres files in the Inspector
func _ready() -> void:
for item in starting_items:
print("Have: %s (x%d max)" % [item.display_name, item.max_stack])func give_unique_copy(template: ItemResource) -> ItemResource:
# true = deep copy sub-resources too; false = shallow (shares sub-resources).
var copy: ItemResource = template.duplicate(true)
copy.value += 5 # mutating the copy won't touch the template .tres
return copyfunc save_config(cfg: Resource) -> void:
ResourceSaver.save(cfg, "user://config.tres") # user:// = writable app data dir
func load_config() -> Resource:
if ResourceLoader.exists("user://config.tres"):
return ResourceLoader.load("user://config.tres")
return null.tresduplicate(true)class_name@exportres://user://res://ResourceSaver.saveres://PackedScenepreloadloadpreloadloadResourceLoader.exists()load.tresload_threaded_request@toolResourceFormatLoaderSaverreferences/resource-patterns.mdgodot-gdscript@exportgodot-nodes-scenessave-systemsunity-scriptableobjects