Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when importing and managing assets — image compression, 3D scene import, audio formats, resource formats, and import configuration
.claude/skills/jame581-assets-pipeline/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 124% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 210% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 328% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 110% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 226% | 0% |
All examples target Godot 4.3+ with no deprecated APIs. GDScript is shown first, then C#.
> Related skills: audio-system for audio playback and bus architecture, 3d-essentials for 3D materials and lighting, 2d-essentials for 2D rendering and sprites, animation-system for imported animations, godot-optimization for asset-related performance, multithreading for threaded resource loading.
When you add a file to res://, Godot auto-imports it based on its type. Import settings are stored in .import sidecar files alongside the original.
project/
├── textures/
│ ├── player.png ← original file (committed to VCS)
│ └── player.png.import ← import settings (committed to VCS)
└── .godot/
└── imported/ ← compiled cache (NOT committed — .gitignore it).godot/imported/ — they are regenerated from originals.import files to version control — they store your settings.godot/ should be in your .gitignore> Import settings can also be set via Advanced Import Settings for 3D scenes (double-click the .glb/.gltf file).
| Mode | Quality | VRAM | File Size | Use For | |----------------|-----------|----------|-----------|----------------------------------| | Lossless | Perfect | High | Large | Pixel art, UI elements | | Lossy | Good | High | Small | Large photos, backgrounds | | VRAM Compressed | Reduced | Low | Small | 3D textures, large 2D sprites | | VRAM Uncompressed | Perfect | High | Large | When VRAM compression artifacts are unacceptable | | Basis Universal | Reduced | Low | Very small | Cross-platform, multiple GPU formats |
Pixel art / UI icons → Lossless (no artifacts, crisp pixels)
2D game sprites → Lossless (small sprites) or VRAM Compressed (large sprites)
3D textures (albedo, normal) → VRAM Compressed (saves GPU memory)
Large backgrounds → Lossy or VRAM Compressed
Mobile targets → VRAM Compressed (essential for memory)| Setting | Description | Default | |--------------------|-----------------------------------------------|-------------| | Compress > Mode | Compression algorithm (see table above) | VRAM Compressed | | Mipmaps > Generate | Generate mipmaps for distance rendering | Off | | Process > Fix Alpha Border | Prevents dark outlines on transparent sprites | On | | Process > Premult Alpha | Pre-multiply alpha (avoids dark halos) | Off | | Flags > Filter | Bilinear filtering (smooth) vs nearest (crisp) | Linear | | Flags > Repeat | Enable texture tiling | Disabled |
For crisp pixel art, set these project-wide:
Project Settings > Rendering > Textures > Canvas Textures > Default Texture Filter → Nearest
Or per-image in Import dock: Filter → Nearest
Mipmaps prevent shimmering on textures viewed at an angle or from a distance. Required for 3D textures; optional for 2D.
> Godot 4.7+: DDS import supports the R8 and R8G8 texture formats. (GH-116307)
| Format | Extension | Recommendation | |-----------|-------------|----------------------------------------------| | glTF | .gltf, .glb | Recommended — open standard, best support | | Blend | .blend | Direct Blender import (requires Blender installed) | | FBX | .fbx | Good for legacy pipelines | | Collada | .dae | Older format, use glTF if possible | | OBJ | .obj | Static meshes only — no animations/rigs |
> glTF is the recommended format. It has the best Godot support, is an open standard, and preserves materials, animations, and rigs accurately.
Godot auto-creates appropriate node types based on suffixes in your 3D model's object names:
| Suffix | Generated Node | Example Name | |-----------------------|---------------------------|----------------------------| | -col | StaticBody3D + collision | Wall-col | | -convcol | ConvexPolygonShape3D | Rock-convcol | | -rigid | RigidBody3D | Barrel-rigid | | -navmesh | NavigationRegion3D | Floor-navmesh | | -occluder | OccluderInstance3D | BigWall-occluder |
In Blender: In Godot (after import):
Wall-col → StaticBody3D
├── Wall (mesh) → ├── MeshInstance3D
→ └── CollisionShape3D (auto-generated)Select the imported .glb/.gltf in FileSystem, then in the Import dock:
| Setting | Description | |----------------------------|--------------------------------------------------| | Root Type | Override root node type (Node3D, RigidBody3D, etc.) | | Root Name | Custom name for the root node | | Meshes > Generate LOD | Auto-generate LOD levels (on by default) | | Meshes > Light Baking | Static or Dynamic for lightmap baking | | Animation > Import | Enable/disable animation import | | Animation > FPS | Bake animation at this framerate |
> Godot 4.7+: The Import dock's import-type option can also import a 3D scene file as a single Mesh resource or as a MeshLibrary (for GridMap), instead of a full scene — no separate export step in the 3D authoring tool needed. (GH-107856)
> ⚠️ Changed in Godot 4.7: EditorSceneFormatImporter's IMPORT_SCENE, IMPORT_ANIMATION, IMPORT_FAIL_ON_MISSING_DEPENDENCIES, IMPORT_GENERATE_TANGENT_ARRAYS, IMPORT_USE_NAMED_SKIN_BINDS, IMPORT_DISCARD_MESHES_AND_MATERIALS, and IMPORT_FORCE_DISABLE_MESH_COMPRESSION constants moved into a new ImportFlags enum (bitfield). GDScript-compatible; C# importer plugins referencing the old class-level constants must switch to the enum members. See the 4.7 migration guide.
Use preload() for paths known at compile time and load() for data-driven paths. GDScript + C# snippets: references/runtime-resource-loading.md.
GLTFDocument exposes an ImportFlags bitfield — IMPORT_FLAG_GENERATE_TANGENT_ARRAYS (8), IMPORT_FLAG_USE_NAMED_SKIN_BINDS (16), IMPORT_FLAG_DISCARD_MESHES_AND_MATERIALS (32), IMPORT_FLAG_FORCE_DISABLE_MESH_COMPRESSION (64) — accepted by the flags: int = 0 parameter of append_from_file(), append_from_buffer(), and append_from_scene():
gdscriptvar doc := GLTFDocument.new() var state := GLTFState.new() doc.append_from_file("user://mods/enemy.glb", state, GLTFDocument.IMPORT_FLAG_GENERATE_TANGENT_ARRAYS | GLTFDocument.IMPORT_FLAG_USE_NAMED_SKIN_BINDS) add_child(doc.generate_scene(state))
csharpvar doc = new GltfDocument(); var state = new GltfState(); doc.AppendFromFile("user://mods/enemy.glb", state, (uint)(GltfDocument.ImportFlags.GenerateTangentArrays | GltfDocument.ImportFlags.UseNamedSkinBinds)); AddChild(doc.GenerateScene(state));
If a 3D file contains a single timeline with multiple animations, split them in the Advanced Import Settings:
.glb file to open Advanced Import SettingsShare animations between characters with different skeletons:
SkeletonProfile resources for standard humanoid mappings| Setting | Description | |-----------------------|------------------------------------------| | Import | Enable/disable animation import | | FPS | Bake framerate (30 is standard) | | Trimming | Remove empty frames at start/end | | Remove Immutable Tracks | Remove tracks that don't change |
> For in-depth audio playback, bus setup, and music management, see the audio-system skill.
| Format | Import As | Use For | Key Settings | |--------|-----------------|---------------------------|-------------------------| | WAV | AudioStreamWAV | Short SFX | Loop Mode, Mix Rate | | OGG | AudioStreamOggVorbis | Music, long SFX | Loop, Loop Offset | | MP3 | AudioStreamMP3 | Music (fallback) | Loop, BPM |
| Setting | Description | When to Use | |---------------|------------------------------------------------|-------------------------| | Loop | Enable looping playback | Music, ambient loops | | Loop Offset | Start position for loop restart | Avoid intro on loop | | Force Mono | Convert stereo to mono | 3D positional audio | | BPM | Beats per minute | Rhythm games | | Beat Count | Total beats in the track | Rhythm sync |
> Import tip: Use WAV for short SFX (zero decode latency). Use OGG for music (small file, good quality). Enable Force Mono for any audio used with AudioStreamPlayer3D — stereo doesn't spatialize properly.
| Format | Type | Readable | Use For | |--------|------------|----------|--------------------------------------| | .tres | Text | Yes | Resources you edit by hand or diff | | .res | Binary | No | Large resources, faster loading |
gdscript# Save as text resource ResourceSaver.save(my_resource, "res://data/item.tres") # Save as binary resource ResourceSaver.save(my_resource, "res://data/item.res") # Load (either format) var resource: Resource = load("res://data/item.tres")
csharpResourceSaver.Save(myResource, "res://data/item.tres"); ResourceSaver.Save(myResource, "res://data/item.res"); var resource = GD.Load<Resource>("res://data/item.tres");
.tres — Custom resources you create and edit (item data, config, skill definitions). Version control friendly..res — Generated or large binary data (baked lightmaps, navigation meshes, large meshes). Faster to load..tscn — Text scene files (always use text for scenes — diffable in VCS).scn — Binary scene files (rare — only for very large scenes where load time matters)Load large resources without freezing the game with the ResourceLoader.load_threaded_request() / load_threaded_get_status() / load_threaded_get() pattern. Full loading-screen recipe (GDScript + C#): references/runtime-resource-loading.md.
| Symptom | Cause | Fix | |---------------------------------------|----------------------------------------------|--------------------------------------------------------------------| | Texture looks blurry | Filter is set to Linear for pixel art | Set Default Texture Filter to Nearest in Project Settings | | Dark outlines on transparent sprites | Alpha border not fixed on import | Enable "Fix Alpha Border" in Import dock | | 3D model has no collisions | No naming suffix in source model | Add -col suffix to mesh names in Blender, or add manually | | Imported animations missing | "Import Animation" disabled in Import dock | Enable Animation > Import and reimport | | Texture VRAM too high on mobile | Using Lossless compression for large textures | Switch to VRAM Compressed for textures > 256px | | 3D textures shimmer at distance | Mipmaps not generated | Enable Mipmaps > Generate in Import dock | | Audio has pop/click at loop point | Loop offset not set correctly | Adjust Loop Offset in Import dock; add fade in audio editor | | Scene file is enormous | Using binary .scn instead of .tscn | Save scenes as .tscn (text) for VCS; use .scn only if needed | | Import settings lost after reclone | .import files not committed to VCS | Always commit .import files; only .godot/ goes in .gitignore | | Threaded load freezes game | Checking status every frame with load() | Use ResourceLoader.load_threaded_request/get_status pattern |
> ⚠️ Changed in Godot 4.7: The font import hinting default changed from 1 (Light) to 3 (Light (Except Pixel Fonts)) — pixel-style fonts now auto-disable hinting on import, so their rendering can change after upgrading. Set hinting back to 1 (Light) in the Import dock per font to keep the 4.6 look. See the 4.7 migration guide.
.gitignore excludes .godot/ but NOT .import filesNearest in Project Settings.glb or .gltf) as the primary import format-col, -convcol) in the 3D authoring tool.tres (text) for version control diffabilityResourceLoader.load_threaded_request().tscn (text format) for version control| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,399 | 6,448 | -43% | 1 | 1 | 0% | 2,324 | 5,217 | +124% | 0 | 0 | — |
case-02 | pass→pass | 8,925 | 5,611 | -37% | 1 | 1 | 0% | 1,438 | 4,695 | +226% | 0 | 0 | — |
case-03 | pass→pass | 4,884 | 3,725 | -24% | 1 | 1 | 0% | 835 | 4,387 | +425% | 0 | 0 | — |
case-04 | pass→pass | 8,209 | 4,011 | -51% | 1 | 1 | 0% | 1,354 | 4,512 | +233% | 0 | 0 | — |
case-05 | pass→pass | 4,687 | 3,065 | -35% | 1 | 1 | 0% | 696 | 4,308 | +519% | 0 | 0 | — |
case-06 | fail→pass | 8,240 | 3,041 | -63% | 1 | 1 | 0% | 1,393 | 4,322 | +210% | 0 | 0 | — |
case-07 | pass→pass | 6,670 | 3,490 | -48% | 1 | 1 | 0% | 1,071 | 4,371 | +308% | 0 | 0 | — |
case-08 | fail→pass | 6,659 | 3,869 | -42% | 1 | 1 | 0% | 1,050 | 4,493 | +328% | 0 | 0 | — |
case-09 | pass→pass | 13,148 | 7,179 | -45% | 1 | 1 | 0% | 1,995 | 4,978 | +150% | 0 | 0 | — |
case-10 | pass→pass | 13,934 | 8,135 | -42% | 1 | 1 | 0% | 2,157 | 5,288 | +145% | 0 | 0 | — |
case-11 | pass→pass | 5,142 | 3,856 | -25% | 1 | 1 | 0% | 835 | 4,421 | +429% | 0 | 0 | — |
case-12 | pass→pass | 11,702 | 4,730 | -60% | 1 | 1 | 0% | 1,725 | 4,546 | +164% | 0 | 0 | — |
case-13 | pass→pass | 7,946 | 5,330 | -33% | 1 | 1 | 0% | 1,154 | 4,601 | +299% | 0 | 0 | — |
case-14 | fail→pass | 12,362 | 3,590 | -71% | 1 | 1 | 0% | 2,103 | 4,414 | +110% | 0 | 0 | — |
case-15 | pass→pass | 26,983 | 4,210 | -84% | 1 | 1 | 0% | 4,585 | 4,609 | +1% | 0 | 0 | — |
case-16 | pass→pass | 14,209 | 5,512 | -61% | 1 | 1 | 0% | 2,621 | 4,947 | +89% | 0 | 0 | — |
case-17 | pass→pass | 11,172 | 7,804 | -30% | 1 | 1 | 0% | 1,672 | 5,083 | +204% | 0 | 0 | — |
case-18 | pass→pass | 11,844 | 7,396 | -38% | 1 | 1 | 0% | 1,865 | 5,114 | +174% | 0 | 0 | — |
case-19 | pass→pass | 8,460 | 3,701 | -56% | 1 | 1 | 0% | 1,290 | 4,368 | +239% | 0 | 0 | — |
case-20 | pass→pass | 27,125 | 13,962 | -49% | 1 | 1 | 0% | 5,137 | 6,489 | +26% | 0 | 0 | — |
case-21 | pass→pass | 24,874 | 15,331 | -38% | 1 | 1 | 0% | 4,533 | 6,556 | +45% | 0 | 0 | — |
case-22 | pass→pass | 21,917 | 22,056 | +1% | 1 | 1 | 0% | 4,021 | 7,918 | +97% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.