Agent Skill to Game-Dev Skill: Godot Resources (GODOT)
Agent Skill to Game-Dev Skill: Godot Resources (GODOT) is a verified SKILL blueprint on Promptally in Game Development optimized for leading AI models. Design data-driven Godot 4.7 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. Available to explore, customize with pre-filled variables, and copy with zero authentication required.
Technical Specifications
| Specification | Value |
|---|---|
| Artifact type | SKILL (Game Development) |
| Compatible engines | Universal / Model Agnostic |
| Input variables | None (pre-filled) |
| Approximate tokens | 1,360 |
| Source file | SKILL.md |
| Access tier | Free public (MIT) |
Pre-Filled Template
---
name: godot-resources
description: >
Design data-driven Godot 4.7 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.
---
# Godot Resources (4.x)
Model game data as reusable, Inspector-editable `Resource` objects instead of hard-coded
values, and load/save them as `.tres`/`.res`. Targets **Godot 4.7**.
## When to use
- Use when representing items, stats, enemy configs, dialogue lines, or level metadata as
data; authoring `.tres` files in the Inspector; or loading/saving custom resources.
**When *not* to use:** nodes/scene structure → `godot-nodes-scenes`; saving the player's
*runtime progress* (engine-agnostic save format/slots) → `save-systems`; the C# variant of
this pattern → `godot-csharp`.
## Core workflow
1. **Subclass `Resource`** with `class_name` and `@export` fields. It now appears in the
"New Resource" dialog and as an `@export` type, editable in the Inspector.
2. **Create instances as `.tres`** files in the FileSystem dock (text, diff-friendly) or
`.res` (binary, smaller/faster). Edit their fields in the Inspector — no code needed.
3. **Reference resources from nodes** via `@export var data: ItemResource`, or arrays
`@export var loot: Array[ItemResource]`.
4. **Load at runtime** with `preload` (constant path) or `load`/`ResourceLoader.load`
(variable path). Use threaded loading for large assets.
5. **Duplicate before mutating** a shared resource at runtime, or every node using it
changes too (resources are shared references).
6. **Save generated/edited resources** with `ResourceSaver.save`.
## Patterns
### 1. A custom data resource
```gdscript
# 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 = 0
```
Create `sword.tres` from this class in the FileSystem dock and fill it in the Inspector.
### 2. Consume resources from a node
```gdscript
extends 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])
```
### 3. Duplicate before mutating shared data
```gdscript
func give_unique_copy(template: ItemResource) -> ItemResource:
# true = deep: copies nested arrays/dictionaries and *embedded* sub-resources, but
# sub-resources saved in their own .tres stay shared. Use
# template.duplicate_deep(Resource.DEEP_DUPLICATE_ALL) to copy those as well.
var copy: ItemResource = template.duplicate(true)
copy.value += 5 # mutating the copy won't touch the template .tres
return copy
```
### 4. Save and load a resource at runtime
```gdscript
func 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
```
## Pitfalls
- **Resources are shared by reference.** A single `.tres` assigned to many nodes is the
*same* object — mutating it changes all of them (and re-saving the file). Call
`duplicate(true)` for per-instance state.
- **A deep copy still changes the original's sub-resource** → `duplicate(true)` only copies
sub-resources embedded in the file; one saved as its own `.tres` (e.g. a shared
`stats.tres` inside `goblin.tres`) is still the same object. Use
`duplicate_deep(Resource.DEEP_DUPLICATE_ALL)` when those must be copied too.
- **`class_name` required to instance from the editor.** Without it the class won't appear
in the "New Resource" dialog or as an `@export` type.
- **`res://` is read-only in exported games.** Write runtime data to `user://`, never
`res://`. `ResourceSaver.save` to `res://` only works in the editor.
- **Storing nodes in a Resource doesn't serialize them.** Resources hold data, not live
scene nodes. Reference scenes via `PackedScene`, not node instances.
- **Cyclic resource references** (A holds B holds A) can fail to save/load cleanly — keep
data graphs acyclic or use IDs/lookups.
- **`preload` vs `load`.** `preload` needs a constant path and loads with the script;
`load` accepts a variable path at runtime. Use `ResourceLoader.exists()` before `load`
to avoid errors on missing files.
- **Don't put secrets in `.tres`** — they ship in plain text inside the export.
## References
- For threaded/background loading (`load_threaded_request`), `@tool` resources with custom
setup, custom `ResourceFormatLoader`/`Saver`, resource-local-to-scene, and resource UIDs,
read `references/resource-patterns.md`.
## Related skills
- `godot-gdscript` — `@export` annotations used to define resource fields.
- `godot-nodes-scenes` — instancing scenes vs. sharing resource data.
- `save-systems` — persisting runtime progress (separate from static data).
- `unity-scriptableobjects` — the equivalent data-asset pattern in Unity.
How to use this skill
- Review the pre-filled example and source files above.
- Copy the template or download
SKILL.md, then use it in your model, IDE, or workflow tool. - Compare your result with the sample output when one is provided.
Frequently Asked Questions
How do I use Agent Skill to Game-Dev Skill: Godot Resources (GODOT)?
Open the skill on Promptally, review the pre-filled example, then copy the template or download SKILL.md and paste it into your model, IDE or workflow tool. Agent Skill to Game-Dev Skill: Godot Resources (GODOT) is a static blueprint with no dynamic variables. Copy it and use it as-is.
Is Agent Skill to Game-Dev Skill: Godot Resources (GODOT) free?
Yes. Agent Skill to Game-Dev Skill: Godot Resources (GODOT) is free to view, copy and download on Promptally without creating an account. It is published under the MIT license.
What variables does Agent Skill to Game-Dev Skill: Godot Resources (GODOT) need?
Agent Skill to Game-Dev Skill: Godot Resources (GODOT) is a static blueprint with no dynamic variables. Copy it and use it as-is.