thedivergentai/godot-scene-management
Expert blueprint for scene loading, transitions, async (background) loading, instance management, and caching. Covers fade transitions, loading screens, dynamic spawning, and scene persistence. Use when implementing level changes OR dynamic content loading. Keywords scene, loading, transition, async, ResourceLoader, change_scene, preload, PackedScene, fade.
npx skills add https://github.com/thedivergentai/GD-Agentic-Skills --skill godot-scene-management
Async loading, transitions, instance pooling, and caching define smooth scene workflows.
> MANDATORY triggers below — read the matching script; do not paste incomplete Autoload loaders.
THREAD_LOAD_FAILED included).SubViewport input plan required).%UniqueName / guarded @onready.load("res://large_scene.tscn") on the Main Thread causes "hiccups" or full freezes during level transitions. Use ResourceLoader.load_threaded_request() for async loading with a progress bar.get_tree().change_scene_to_file() for transient state — This method purges the current scene and all its local variables. Use an Autoload (Singleton) or a persistent 'Game' node to store state across levels.instantiate() and queue_free() calls spike CPU and trigger the Garbage Collector too often.get_node("../../Path/To/Node") — These paths break as soon as you move a node in the editor. Use Scene Unique Names (%NodeName) or @export var target_node: Node for robust references.global_transform and re-apply it after the add_child() call.PhysicsServer and RenderingServer directly for raw performance.NOTIFICATION_WM_CLOSE_REQUEST — On desktop, if you don't handle the close request in a persistent node, the game may close during a critical save operation.queue_free() is natively recursive in Godot 4. Freeing the root node automatically cleans up all children. Manual loops are redundant and inefficient.SubViewport and main world inputs without a plan — By default, input events bubble up. Use set_input_as_handled() to prevent UI clicks in a subviewport from triggering gameplay in the main world.change_scene to "Reset" a level — It reloads everything from disk. For a quick respawn, just reset the variables and move the player to the start position.| Goal | Prefer | MANDATORY script |
|------|--------|------------------|
| Full level swap with progress UI | Threaded load → swap when THREAD_LOAD_LOADED | async_scene_manager.gd |
| Hide hitch before a door/trigger | Start threaded request early during play | background_resource_loader.gd |
| Fade / wipe around a swap | Transition Autoload wraps the manager | scene_transition_manager.gd |
| Keep world; show pause/map/inventory | Additive UI layer (do not change_scene) | additive_ui_layering.gd |
| Manual root swap / deferred free | Own current_scene lifecycle | Peer docs + safe patterns in godot-autoload-architecture |
| Spawn many identical actors | Pool, never raw instantiate/free storms | scene_pool.gd / scene_instancing_pooling.gd |
| Minimap / split render | SubViewport + update mode + input isolation | subviewport_scene_layering.gd |
| Survive scene purge | Autoload / persist group — not locals | persistent_data_preservation.gd / scene_state_manager.gd |
| Quick respawn | Reset state + teleport — not change_scene | — |
| DLC / hot patch scenes | ProjectSettings.load_resource_pack then load path | (PCK) see Official Docs |
PROCESS_MODE_DISABLED + hide) — absorb instantiate cost up front via scene_pool.gd.load_threaded_request mid-gameplay; transition only when loaded (background_resource_loader.gd).change_scene/load the same res:// path for patched content.Performance.OBJECT_ORPHAN_NODE_COUNT > 0 means leaked refs still hold freed nodes.queue_free() on a root is recursive in Godot 4; no manual child loops.change_scene just to restart a level.Fade Autoloads, loading screens, spawn tracking, persistence holders, PCK patch — references/scene-patterns-deep.md.
> Progressive disclosure: open Official Documentation links only when researching a specific API; load Related Skills when routing to a peer domain — do not preload the whole lattice.
ResourceLoader.load_threaded_request / status polling for hitch-free level loads and progress bars.change_scene_to_file for staged transitions).current_scene, pause, groups, and how the tree relates to Autoload root children across swaps.PackedScene.instantiate(), ownership, and when to preload vs load at runtime.%Name references that survive hierarchy edits better than brittle get_node("../../…") paths.SubViewport worlds for minimaps, split-screen, and layered rendering without swapping the main scene.ProjectSettings.load_resource_pack for DLC/mod scene overrides on res:// paths.load_threaded_*, exists) used by async managers.change_scene_to_packed, and instance caches.await, and process-frame polling required by threaded load loops and transition staging.change_scene without becoming God Objects..tscn paths instead of hardcoded strings.ResourceLoader queues from this skill.Take thedivergentai/godot-scene-management from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.