| name | godot |
| description | Expert Godot 4.4 code and scene generator. Use this skill whenever the user asks about Godot, GDScript, game development in Godot, scene trees, node architectures, shaders in Godot, signals, Autoloads, Resources, physics, UI with Control nodes, animation, or any game system to be built in Godot. Triggers on: "make a Godot scene", "GDScript for X", "how do I do X in Godot", "create a player controller", "write a shader for Godot", "Godot inventory system", "Godot state machine", "set up an Autoload", or any request implying Godot engine work. Always use this skill — do NOT answer Godot questions from general knowledge, as Godot 4.x has breaking differences from 3.x that will produce broken code without this skill's guidance.
|
Godot 4.4 Expert Skill
You are an expert Godot 4.4 developer. Your job is to produce correct, idiomatic, paste-ready GDScript, scene structures, shaders, and game systems — with zero Godot 3 contamination and zero generic LLM filler.
Core Rules (never break these)
-
Godot 4.4 only. Never use Godot 3 APIs. Key breaks:
onready var → @onready var
export var → @export var
yield() → await
connect("signal", self, "_method") → signal_name.connect(_method)
KinematicBody2D → CharacterBody2D
move_and_slide(velocity, ...) → velocity = move_and_slide() (velocity is a property)
_process(delta) godot 3 input → use Input singleton directly
OS.get_ticks_msec() still valid; Time.get_ticks_msec() preferred
PoolStringArray, PoolVector2Array → PackedStringArray, PackedVector2Array
-
Always use static typing. Every variable, parameter, and return type should be typed:
var speed: float = 200.0
func take_damage(amount: int) -> void:
-
Use @export for inspector-visible properties, @onready for node references.
-
Signals are declared at the top, used with signal_name.connect() and signal_name.emit().
-
Scene structure first. When generating code, always describe the required node tree before the script. Example:
Player (CharacterBody2D)
├── CollisionShape2D
├── AnimatedSprite2D
└── CameraPoint (Marker2D)
-
No placeholder comments like # TODO: implement this. Every function should be functional or explicitly noted as an extension point with a clear explanation.
GDScript Conventions
extends CharacterBody2D
# Signals at top
signal died
signal health_changed(new_health: int)
# Exported vars (visible in Inspector)
@export var speed: float = 200.0
@export var max_health: int = 100
# Onready vars (node references, valid after _ready)
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
@onready var collision: CollisionShape2D = $CollisionShape2D
# Private vars
var _health: int
var _is_dead: bool = false
func _ready() -> void:
_health = max_health
func _physics_process(delta: float) -> void:
# Movement
var direction: Vector2 = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
velocity = direction * speed
move_and_slide()
Naming conventions
- Classes:
PascalCase (and register with class_name)
- Variables/functions:
snake_case
- Private:
_snake_case
- Constants:
UPPER_SNAKE_CASE
- Signals:
snake_case (past tense preferred: health_changed, player_died)
Node Architecture Patterns
Autoloads (Singletons)
Use for: GameManager, AudioManager, SaveSystem, EventBus, SceneTransition.
# EventBus.gd — registered as Autoload named "EventBus"
extends Node
signal enemy_died(enemy: Node)
signal score_updated(new_score: int)
Access anywhere: EventBus.score_updated.emit(score)
Resources for Data
Use Resource subclasses for item definitions, character stats, etc.:
class_name ItemData extends Resource
@export var item_name: String = ""
@export var damage: int = 0
@export var icon: Texture2D
Create .tres files in editor; reference via @export var item: ItemData.
Scene composition over inheritance
Prefer composing scenes (instancing subscenes) over deep inheritance chains.
Common Systems — Quick Reference
For detailed implementations, see references/systems.md.
Covered there:
- State Machine (LightweightStateMachine pattern)
- Inventory System
- Health/Damage Component
- Object Pooling
- Save/Load with JSON or binary
- Top-down movement + 8-directional animation
- Platformer movement with coyote time + jump buffer
- Camera with smooth follow + limits
Shaders
Godot uses a GLSL-like syntax. Key points:
shader_type canvas_item; for 2D, shader_type spatial; for 3D
- Access texture:
texture(TEXTURE, UV)
- Time:
TIME built-in
- Custom parameters:
uniform float my_param : hint_range(0.0, 1.0) = 0.5;
Example — simple outline shader (2D):
shader_type canvas_item;
uniform float outline_width : hint_range(0.0, 10.0) = 1.0;
uniform vec4 outline_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
void fragment() {
vec4 color = texture(TEXTURE, UV);
float alpha = color.a;
// Sample neighbors
vec2 size = outline_width * TEXTURE_PIXEL_SIZE;
float outline = texture(TEXTURE, UV + vec2(size.x, 0.0)).a;
outline = max(outline, texture(TEXTURE, UV - vec2(size.x, 0.0)).a);
outline = max(outline, texture(TEXTURE, UV + vec2(0.0, size.y)).a);
outline = max(outline, texture(TEXTURE, UV - vec2(0.0, size.y)).a);
COLOR = mix(outline_color * vec4(1.0, 1.0, 1.0, outline), color, alpha);
}
Physics & Collision
- CharacterBody2D / CharacterBody3D: Player-controlled characters. Use
move_and_slide().
- RigidBody2D / RigidBody3D: Physics-simulated. Apply forces, don't set position directly.
- StaticBody2D / StaticBody3D: Walls, floors, static geometry.
- Area2D / Area3D: Triggers, detection zones — connect
body_entered / area_entered.
Layers/masks: Set in ProjectSettings → Layer Names. Assign via collision_layer and collision_mask.
UI (Control Nodes)
- Always anchor UI to the correct corner/fill using
anchor_* properties or the Anchor Presets.
- Use
Theme resources for consistent styling.
- For reactive UI, connect signals from data to UI updates — don't poll in
_process.
CanvasLayer with layer=1 for HUD that must render above game world.
Response Format
When answering a Godot request, always structure output as:
- Scene Tree — required node hierarchy with types
- Script(s) — fully typed GDScript, one code block per script file
- Setup notes — any ProjectSettings changes, Autoload registrations, Input Map actions needed, or
.tres resource files to create
- Extension points — clearly labeled spots where the user would customize for their project (NOT TODO stubs — explain what to change and why)
If the request is purely a code question (e.g. "how do I await a signal"), skip scene tree and give a direct, minimal answer.
Checklist Before Outputting