Help us improve
Share bugs, ideas, or general feedback.
From summer
Guides Godot scene composition with node hierarchy conventions, sub-scene extraction, and instantiation patterns for reusable prefabs.
npx claudepluginhub summerengine/summer-engine-agent --plugin summerHow this skill is triggered — by the user, by Claude, or both
Slash command
/summer:scene-composition**/*.tscnThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Organize scenes for clarity, reuse, and MCP compatibility. Follow these conventions when building levels, characters, and UI.
Constructs Godot scenes from patterns like platformer characters, top-down chars, UI screens, projectiles, pickups, tilemaps with required companion nodes (e.g., CollisionShape2D).
Guides Godot 4.3+ scene tree design: composition vs inheritance, when to split scenes, and node hierarchy patterns with reusable component examples.
Designs Godot 4.x scenes (.tscn files), node hierarchies, and level layouts. Provides patterns for 2D/3D players, enemies, UI, HUD, inventories, and worlds.
Share bugs, ideas, or general feedback.
Organize scenes for clarity, reuse, and MCP compatibility. Follow these conventions when building levels, characters, and UI.
World (Node3D) # Root or main container
├── Camera3D # Main camera
├── DirectionalLight3D # Sun / primary light
├── WorldEnvironment # Sky, ambient, fog
├── Level (Node3D) # Level geometry
│ ├── Ground
│ ├── Walls
│ └── Platforms
├── Props (Node3D) # Placed objects (trees, crates)
├── Enemies (Node3D) # Enemy instances
└── Player # Player instance (or instantiated)
Level (Node2D)
├── TileMapLayer # Or TileMap
├── Characters
├── Props
└── Effects
CanvasLayer or Control
├── MarginContainer
│ ├── VBoxContainer
│ │ ├── Label
│ │ ├── Button
│ │ └── Button
Use ./ for paths relative to the scene root:
| Path | Meaning |
|---|---|
./ | Scene root |
./World | Child named "World" of root |
./World/Player | Player under World |
./World/Props/Tree1 | Tree1 under Props under World |
Never use /World (absolute) or World (missing ./). The engine expects ./ prefix.
Use sub-scenes (separate .tscn files) when:
Use inline nodes when:
summer_save_scene(path="res://scenes/player.tscn"). SaveScene saves the current open scene, so build reusable scenes in their own open scene and save them there. Do not handwrite .tscn files as the preferred path.summer_instantiate_scene(parent="./World", scene="res://scenes/player.tscn", name="Player")Practical approach: Create reusable scenes (player.tscn, enemy.tscn) as separate scene files, then instantiate them into levels.
| Use | Tool | Example |
|---|---|---|
| Built-in mesh (Box, Sphere) | AddNode + SetProp | summer_add_node type=MeshInstance3D, then summer_set_prop mesh=BoxMesh |
| Existing .tscn prefab | InstantiateScene | summer_instantiate_scene scene=res://player.tscn |
| Imported .glb model | ImportFromUrl then InstantiateScene | Import first, then instantiate |
Do not use summer_set_prop with mesh for a .glb path. Use summer_instantiate_scene for .tscn and .glb files.
summer_save_scene after changes you want to keepsummer_save_scene(path="res://scenes/level1.tscn")summer_save_scene (no path, uses current scene path)./NonExistent fails. Ensure the parent exists before adding children.path for new scenes.No fallback for this — Summer MCP required. Handwriting .tscn files for hierarchy mutations is error-prone (UID collisions, wrong format version, broken sub_resource refs). If MCP isn't connected, open the scene in the Godot editor and use the SceneTree dock.
When you duplicate a scene to spawn a sibling level (for example, level_1.tscn → level_2.tscn), every child instance carries its transform offset baked at the original level's coordinate system. If the source level places its player at world (223, 108, -1833) and instances a kill-volume scene at offset (512, -3, 512), those numbers are anchored to the source level's terrain origin. Drop the same kill-volume instance into a level whose player spawns at world (0, 1, 0) and the volume's wall colliders may end up slicing the new arena at world x = 0. The user sees a "glitching invisible line through the middle of the map" they can't pass through. The colliders are invisible under the floor, so visual diagnosis is hard. Only collision-walking through them reveals the problem.
Rule when copying a scene as a template:
transform = Transform3D(...) lines.(0,0,0)), or drop entirely.(0,0,0)) should drop ALL transform overrides from carry-over instances. Only re-add transforms relative to the new origin.Godot's SpringArm3D shortens the camera boom when it raycasts into geometry on the configured collision_mask. If your trees, bushes, or grass have collision so the player physically bumps them, on the same layer the SpringArm queries, the camera shortens for foliage too. Players see the camera awkwardly snap forward whenever they walk near a tree.
The pattern that works:
StaticBody3D: collision_layer = 256 (which is 2^8, layer 9).collision_mask.
CharacterBody3D: collision_mask = 259 (which is 1 + 2 + 256, Entities + Level + Foliage).collision_mask = 3 (which is 1 + 2, Entities + Level only).camera_fade group. An existing camera-occlusion fade system can ghost the mesh by AABB intersection with the camera-to-player segment without touching collision.Why per-layer split: there's no clean way to exclude a single body type from SpringArm3D's collision check via add_excluded_object for dynamically-spawned foliage. You'd have to register every tree at spawn time and re-register on level change. Layer-level filtering is set-and-forget.
Don't skip the player mask update. If you only move foliage to layer 9 without adding it to the player's mask, the player walks straight through trees.
This skill creates and mutates scene files. Always ask before applying: "May I create res://scenes/player.tscn and instantiate it under ./World?". See ../../references/collaborative-protocol.md.