create-scene
Skill2 starsChanged 6 months agoMITView on GitHub
Scaffold a new Godot 4.x scene from genre-agnostic templates — 2D/3D player, enemy, level, main menu, pause menu, HUD, inventory UI, dialogue UI. Picks the right root node, wires signals in code, follows composition pattern.
2 other projects use a version of this.
Adopted by
Most recently taken up by
- decentraland/sdk-skillstheir own version, first seen Oct 25, 2026
- design1online/author-ittheir own version, first seen Jul 13, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- decentraland/sdk-skills★ 4same name
- design1online/author-it★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository33 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- bootstrap-godot-projectSkill
- codebase-surveySkill
- create-autoloadSkill
- create-componentSkill
- create-resourceSkill
- create-state-machineSkill
- export-configSkill
- feature-planSkill
- feature-specSkill
- game-brainstormingSkill
- gdd-writerSkill
- genre-pack-3d-actionSkill
- genre-pack-platformerSkill
- genre-pack-topdownSkill
- genre-pack-turnbasedSkill
- godot-patternsSkill
- gut-test-writerSkill
- networking-foundationSkill
- performance-auditSkill
- save-schema-migrationSkill
- setup-collision-layersSkill
- setup-git-godotSkill
- setup-input-mapSkill
- setup-localizationSkill
- setup-save-systemSkill
- sfx-generatorSkill
- shader-writerSkill
- subagent-dev-modeSkill
- ui-patterns-godotSkill
- update-docsSkill
- using-godot-superpowersSkill
- writing-game-planSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 0 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 12
If no template matches, fall back to manual scaffolding using the principles in godot-patterns.
- Very specific: line 227
Use RichTextLabel.visible_ratio tween for typewriter effect.
- Very specific: line 239
Add to relevant groups: add_to_group("enemies"), add_to_group("persist"), etc.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Create a Scene
Templates available. Pass <template> <name> (e.g. 2d-player Player, 3d-character Hero, main-menu MainMenu).
If no template matches, fall back to manual scaffolding using the principles in godot-patterns.
Templates
2d-player — CharacterBody2D player
{Name} (CharacterBody2D)
├── Sprite2D (or AnimatedSprite2D)
├── CollisionShape2D
├── Hurtbox (Area2D) -> takes damage; layer: PlayerHurtbox
│ └── CollisionShape2D
├── Hitbox (Area2D) -> deals damage; layer: PlayerHitbox
│ └── CollisionShape2D
├── HealthComponent (Node)
├── StateMachine (Node)
│ ├── Idle (Node)
│ ├── Run (Node)
│ ├── Jump (Node)
│ └── Fall (Node)
├── Camera2D (optional, for player-following)
└── AnimationPlayerScript: extends CharacterBody2D, class_name Player. Connect Hurtbox.area_entered and forward to HealthComponent.take_damage. Use setup-collision-layers skill for the layer config.
The Player scene re-emits HealthComponent's signals so coordinators can connect on the root node instead of digging into children:
class_name Player
extends CharacterBody2D
signal health_changed(old: float, new: float)
signal died
@onready var _health: HealthComponent = $HealthComponent
func _ready() -> void:
_health.health_changed.connect(func(old, new): health_changed.emit(old, new))
_health.died.connect(func(): died.emit())3d-character — CharacterBody3D player or NPC
{Name} (CharacterBody3D)
├── MeshInstance3D (or Skeleton3D for rigged)
├── CollisionShape3D
├── Hurtbox (Area3D)
│ └── CollisionShape3D
├── HealthComponent (Node)
├── StateMachine (Node)
├── CameraPivot (Node3D) -> rotated by input
│ └── SpringArm3D -> collision-aware camera arm
│ └── Camera3D
├── AnimationPlayer / AnimationTree
└── NavigationAgent3D (NPCs only)Script: set velocity, call move_and_slide(). Camera: rotate CameraPivot from mouse/stick.
2d-enemy
{Name} (CharacterBody2D)
├── Sprite2D
├── CollisionShape2D
├── Hurtbox (Area2D) -> EnemyHurtbox layer
│ └── CollisionShape2D
├── Hitbox (Area2D) -> EnemyHitbox layer
│ └── CollisionShape2D
├── HealthComponent
├── StateMachine -> Patrol, Chase, Attack, Stunned
├── DetectionArea (Area2D) -> sees player
├── NavigationAgent2D
└── AnimationPlayer3d-enemy
{Name} (CharacterBody3D)
├── MeshInstance3D
├── CollisionShape3D
├── Hurtbox (Area3D) -> EnemyHurtbox layer
│ └── CollisionShape3D
├── Hitbox (Area3D) -> EnemyHitbox layer
│ └── CollisionShape3D
├── HealthComponent
├── StateMachine -> Patrol, Chase, Attack, Stunned
├── DetectionArea (Area3D) -> sees player
├── NavigationAgent3D
└── AnimationPlayerlevel — generic level/world container
level (2D)
{Name}Level (Node2D)
├── World
│ ├── TileMapLayer
│ ├── StaticBody2D / collision
│ └── NavigationRegion2D
├── Entities (Node)
│ ├── PlayerSpawn (Marker2D)
│ ├── EnemySpawns (Node)
│ └── Pickups (Node)
├── Triggers (Node) -> Area2D-based events
├── HUD (CanvasLayer)
│ └── ...
└── Music (AudioStreamPlayer)level (3D)
{Name}Level (Node3D)
├── World
│ ├── GridMap
│ ├── StaticBody3D / collision
│ └── NavigationRegion3D
├── Entities (Node)
│ ├── PlayerSpawn (Marker3D)
│ ├── EnemySpawns (Node)
│ └── Pickups (Node)
├── Triggers (Node) -> Area3D-based events
├── HUD (CanvasLayer)
│ └── ...
├── DirectionalLight3D
├── WorldEnvironment
└── Music (AudioStreamPlayer)main-menu
{Name}MainMenu (Control)
├── Background (TextureRect | ColorRect | Node3D viewport)
├── MarginContainer
│ └── VBoxContainer
│ ├── TitleLabel
│ └── ButtonContainer (VBoxContainer)
│ ├── PlayButton
│ ├── ContinueButton
│ ├── OptionsButton
│ ├── CreditsButton
│ └── QuitButton
├── VersionLabel (Label, anchored bottom-right)
└── Music (AudioStreamPlayer)Set anchors_preset = PRESET_FULL_RECT. Use focus_neighbor_* for gamepad nav. Connect pressed signals in _ready.
pause-menu
{Name}PauseMenu (CanvasLayer)
├── DimBackground (ColorRect, anchored full)
├── Panel
│ └── VBoxContainer
│ ├── ResumeButton
│ ├── OptionsButton
│ └── QuitButtonSet process_mode = PROCESS_MODE_WHEN_PAUSED on the root. Toggle get_tree().paused from a controller node.
hud — gameplay HUD overlay
{Name}HUD (CanvasLayer)
├── TopBar (HBoxContainer, anchored top)
│ ├── HealthBar (TextureProgressBar)
│ ├── ScoreLabel
│ └── PauseIcon
├── BottomBar (HBoxContainer, anchored bottom)
│ ├── InventoryBar
│ └── AbilityBar
└── CenterPopup (Control) -> "Level Up!", "Wave 1", etc.Subscribe to EventBus signals in _ready (e.g. EventBus.health_changed.connect(_on_health)).
inventory-ui
{Name}InventoryUI (Control)
├── Background (Panel)
├── HSplitContainer
│ ├── ItemGrid (GridContainer, scrollable)
│ └── DetailPanel (VBoxContainer)
│ ├── ItemIcon (TextureRect)
│ ├── ItemName (Label)
│ ├── ItemDescription (RichTextLabel)
│ └── UseButton
└── CloseButtonEach ItemGrid slot = scene with Item resource binding. Emit item_selected(item) to update DetailPanel.
dialogue-ui
{Name}DialogueUI (CanvasLayer)
├── DialogueBox (PanelContainer, anchored bottom)
│ ├── PortraitTexture
│ ├── VBoxContainer
│ │ ├── SpeakerLabel
│ │ └── DialogueLabel (RichTextLabel, BBCode enabled)
│ └── ContinueIndicator
└── ChoicesContainer (VBoxContainer) -> dynamic Button childrenUse RichTextLabel.visible_ratio tween for typewriter effect.
Mandatory checklist for any scene
- Root node = the most specific class needed (
CharacterBody2D,Control,Node3D, etc.) class_nameset if scene is reusable from code- Script with file-top docstring (one-line purpose)
- Signals connected in code in
_ready(), not via editor - Components as child nodes (composition, not deep
extends) - Materials/Themes set in code only when dynamic; otherwise drag a
.tres @onreadyfor any node accessed more than once- Unique names (
%) for important child nodes accessed from script - Add to relevant groups:
add_to_group("enemies"),add_to_group("persist"), etc. - Set
process_modecorrectly if the scene must behave differently when paused - Collision layers set per the convention from
setup-collision-layers
Coordinator pattern (for orchestrating scenes)
A scene root can act as a coordinator: it wires signals between subsystems in _ready() but holds no internal logic itself. Each child subsystem is self-contained and testable in isolation.
extends Node2D
class_name BattleScene
@onready var grid_manager: GridManager = $GridManager
@onready var player: Player = $Player
@onready var hud: HUD = $HUD
func _ready() -> void:
player.health_changed.connect(hud.update_health)
player.died.connect(_on_player_died)
grid_manager.cell_clicked.connect(_on_cell_clicked)
func _on_player_died() -> void:
SceneManager.change_to("res://scenes/ui/game_over.tscn")Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

