hermeticormus/claude-code-game-development/godot-development
Claude Code and agent skill by hermeticormus/claude-code-game-development
- community
- ext:[{"type":"plugin","description":"Custom plugin integration"}]
Checking that the SKILL.md file is still in the repository.
Godot 4 reference patterns: signal-vs-call and physics-body decision tables, resource sharing traps, input handling, a common mistakes catalog, a GDScript to C# rosetta, typed class structure, pooling, autoloads, GUT tests, and collision layer constants. Use when designing, writing, or reviewing Godot 4 code.
Install
npx vskill@latest install hermeticormus/claude-code-game-development/godot-developmentSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
Godot development pattern library
Reference patterns for Godot 4 development. Use as lookup when designing or reviewing Godot code.
Signal vs. direct call decision
| Case | Choose | |
|---|---|---|
| Emitter doesn't know listeners (achievement system, sound manager) | Signal | |
| Emitter knows exactly one listener and the relationship is tight | Direct call | |
| Multiple listeners with shared interest | Signal | |
| Receiver needs to return a value to caller | Direct call | |
| Order of execution matters | Direct call (signals are deferred by default) | |
| Crossing scene boundaries | Signal (or autoload) |
Convention: signal names are past-tense verbs (died, damaged, level_completed).
Resource sharing
The trap: @export var config: ConfigResource gives every instance the SAME resource. Modifying it affects all instances.
Safe patterns:
Input handling matrix
| Source | Use for | |
|---|---|---|
Input.is_action_pressed("name") in _process | Continuous input (movement) — but adds 1 frame latency | |
Input.is_action_just_pressed("name") in _process | One-shot input — same latency caveat | |
_unhandled_input(event) with event.is_action_pressed("name") | One-shot input with no latency | |
_input(event) with event.is_action_pressed("name") | Input that should ignore GUI focus | |
_gui_input(event) | UI input only (on Control nodes) |
Physics body decision
| Body | Use when | |
|---|---|---|
CharacterBody2D / CharacterBody3D | Player or NPC under direct control | |
RigidBody2D / RigidBody3D | Object responds to physics forces | |
RigidBody* with freeze_mode = KINEMATIC | Want physics events but control velocity directly | |
StaticBody* | Immovable collider (wall, floor) | |
AnimatableBody* | Moving platform — animates but pushes RigidBody correctly | |
Area2D / Area3D | Trigger volume, no collision response |
Common mistakes catalog
"Physics is jittery"
Almost always _process instead of _physics_process. Variable timestep + physics = drift.
"Input feels laggy"
Input.is_action_pressed in _process is one frame behind. For responsive actions, use _unhandled_input.
"Modifying one enemy's HP changes all enemies"
Resource sharing. The HP value is in an @exported EnemyConfig resource. Either .duplicate() it on _ready() or store HP in the Enemy node, not in the resource.
"Signal fires too late / wrong order"
Signals are deferred (call_deferred semantics) when emitted from physics process. For immediate ordering, direct calls. For correct ordering across signals, use await:
"Camera2D doesn't follow player"
Camera2D needs enabled = true and to be a child of the moving body. Or use set_make_current() if multiple cameras exist.
"Autoload script crashes on get_node"
Autoloads load before scenes. Getting nodes from a scene that doesn't exist yet fails. Either:
- Use signals for autoload → scene communication
- Defer the
get_nodeuntil after_ready()
"Scene I instantiated has wrong values"
You instantiated from a PackedScene resource. Edits to one instance don't affect the PackedScene. Conversely, edits to the PackedScene affect all future instances but not existing ones.
"C# script doesn't see GDScript class"
GDScript classes are not visible to C# (and vice versa) until you use class_name for GDScript and the class is exported. Cross-language work requires explicit interfaces.
Animation pattern card
| System | Use for | |
|---|---|---|
AnimationPlayer | Cutscenes, simple state transitions, UI animations | |
AnimationTree + AnimationNodeStateMachine | Character gameplay state (idle/walk/run/jump) | |
AnimationTree + AnimationNodeBlendTree | Blended animations (walk-aim with separate body parts) | |
AnimationTree + AnimationNodeBlendSpace2D | Directional blends (8-way walking) | |
Tween | UI transitions only (not characters) |
GDScript ↔ C# rosetta
| GDScript | C# | |
|---|---|---|
extends Node2D | : Node2D (class declaration) | |
@export var hp := 100 | [Export] public int Hp = 100; | |
signal died | [Signal] public delegate void DiedEventHandler(); | |
@onready var sprite = $Sprite2D | Get in _Ready(): _sprite = GetNode<Sprite2D>("Sprite2D"); | |
func _ready(): | public override void _Ready() | |
func _physics_process(delta): | public override void _PhysicsProcess(double delta) | |
await get_tree().process_frame | await ToSignal(GetTree(), SceneTree.SignalName.ProcessFrame); |
Project structure conventions
Performance reference card
| Issue | Cost | Fix | |
|---|---|---|---|
Many _process scripts | Each is a method call per frame | Consolidate or use signal-driven updates | |
Many _physics_process scripts | Each is a method call per physics tick | Same as above | |
| Drawing many sprites | Each is a draw call | MultiMeshInstance2D for repeated identical sprites | |
| Many small Area2D | Each does a physics query | Combine queries; use raycast for one-shot | |
| GDScript heavy loop | GDScript is interpreted | Move hot loop to C# or use bulk operations | |
| String concatenation in loop | Allocates new String each time | StringBuilder pattern with PackedStringArray + join |
Typed GDScript Class Structure
Scene Inheritance Pattern
Autoload Singleton (correct usage)
PackedScene Pooling
Signal-Based Component Communication
GUT Unit Test Structure
Collision Layer Constants
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingplugins/godot-development/skills/godot-development/SKILL.md
Popularity
- Repository stars
- 65
- Repository forks
- 11
- 7-day trend score
- 26
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Extension points
pluginCustom plugin integration
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/hermeticormus/claude-code-game-development/godot-development)