Agentic Game Development with Visual Feedback (GameDevBench)
This skill enables Claude to tackle game development tasks in Godot Engine using the agentic workflow and visual feedback mechanisms from GameDevBench (arXiv:2602.11103). The core insight: game development requires simultaneously navigating large codebases, understanding hierarchical scene graphs, and manipulating intrinsically multimodal assets (sprites, shaders, animations, audio). By incorporating screenshot feedback from the Godot editor and runtime video capture, agents improve from ~33% to ~48% task success -- a technique this skill applies to real Godot projects.
When to Use
- When the user asks to create, modify, or debug a Godot Engine project (GDScript, .tscn scenes, .tres resources)
- When working with sprite sheets and the user needs animation frames extracted, ordered, or assigned to an AnimatedSprite2D node
- When editing shader files (.gdshader) or visual shader parameters for effects like outlines, dissolves, or post-processing
- When building or restructuring a scene's node hierarchy (adding CollisionShape2D, Camera3D, UI containers, etc.)
- When the user has a game that "doesn't look right" and needs visual verification of scene composition
- When implementing gameplay logic that interconnects signals, physics layers, and node references across multiple files
- When porting a game tutorial (web or video) into a working Godot project
Key Technique
Multi-file, multimodal-aware editing with visual feedback loops. GameDevBench found that game development tasks average 5 files modified and 106 lines changed per solution across 3.4 distinct file types -- far exceeding typical software engineering benchmarks. The critical differentiator is that errors are often visual, not logical: an agent might wire up correct gameplay code but select walking sprites instead of attack sprites, or attach a node at the wrong depth in the scene tree. Traditional text-only feedback (compiler errors, test output) cannot catch these mistakes.
Two feedback mechanisms close this gap. First, editor screenshot feedback: capturing a screenshot of the Godot editor after changes shows the scene graph structure, the inspector panel with node properties, and the 2D/3D viewport with the current visual state. This lets the agent verify node hierarchy, property values, and spatial layout. Second, runtime video feedback: using Godot's built-in recording to capture a short gameplay clip reveals temporal dynamics -- whether animations play correctly, physics behave as expected, and camera movement tracks properly. The paper found that either mechanism alone delivers most of the improvement; combining them yields marginal additional gains.
The practical implication for coding agents: after each significant edit pass, take a visual checkpoint. Compare the visual state against the task requirements. If the visual output diverges from intent, diagnose whether the issue is structural (wrong node hierarchy), referential (wrong asset path or sprite frame), or parametric (wrong property values). This feedback loop catches the dominant failure mode in game development: correct code structure with incorrect multimodal asset integration.
Step-by-Step Workflow
Inventory the project structure. Scan the Godot project directory for project.godot, all .tscn scene files, .gd scripts, .gdshader shaders, and asset directories (sprites, audio, fonts). Map the dependency graph: which scenes instance other scenes, which scripts attach to which nodes.
Parse the target scene's node tree. Read the relevant .tscn file and reconstruct the node hierarchy. Godot's tscn format is text-based -- each [node] entry specifies name, type, parent (path relative to root), and property overrides. Identify the exact insertion point for new nodes and the parent-child relationships.
Catalog available assets. List all image files (.png, .svg), audio files (.wav, .ogg), font files (.ttf), and resource files (.tres). For sprite sheets, determine the grid dimensions and which frames correspond to which animation states (idle, walk, attack, jump). This prevents the most common agent failure: selecting wrong sprite frames.
Plan the multi-file edit. Game tasks typically require coordinated changes across scene files (.tscn), scripts (.gd), resource files (.tres), and sometimes shaders (.gdshader). Draft which files change, what nodes are added/modified, and what signals need connecting. Verify that node paths used in scripts match the actual scene tree paths.
Edit scene files with correct hierarchy. When adding nodes to .tscn, ensure:
- The
parent path is correct (use . for root children, NodeA for children of NodeA, NodeA/NodeB for deeper nesting)
- Required companion nodes exist (e.g., a
CharacterBody2D needs a CollisionShape2D child)
- Resource references (
ExtResource / SubResource) point to valid IDs declared in the file header
Write or modify GDScript with proper node references. Use $NodeName or get_node("path") with paths that match the actual scene tree. Connect signals either in the scene file ([connection] entries) or via code (node.signal_name.connect(callable)). Verify that exported variables (@export) match the types expected by the inspector.
Handle sprite animations correctly. For AnimatedSprite2D, create a SpriteFrames resource with named animations. Each animation needs frames in the correct order, appropriate FPS, and loop settings. For sprite sheets, use AtlasTexture resources with correct region Rect2 values to extract individual frames. Double-check frame selection against the visual content of the sprite sheet.
Verify with visual feedback. If the user can provide a screenshot of the Godot editor or a recording of gameplay, use it to verify:
- Node hierarchy appears correctly in the Scene dock
- Properties in the Inspector match expected values
- The 2D/3D viewport shows correct spatial arrangement
- Animations play with correct frames and timing
If no visual feedback is available, mentally simulate the visual output from the scene data and flag potential discrepancies.
Run deterministic checks. If tests exist (test.gd / test.tscn), describe how to execute them via godot --headless --path . -s test.gd. Check for node existence, property values, collision layer setup, and signal connections. Parse test output to identify remaining failures.
Iterate on failures with targeted fixes. When something fails, classify the error type:
- Structural: Wrong node type, missing child node, incorrect parent path -- fix the .tscn file
- Referential: Wrong asset path, wrong sprite frame, broken signal connection -- fix the resource reference or path string
- Parametric: Wrong property value (scale, position, color, physics layer) -- fix the specific property
- Logical: Script behavior incorrect -- fix the .gd file logic
Apply the minimal fix for the specific error category rather than rewriting broadly.
Concrete Examples
Example 1: Adding a character animation from a sprite sheet
User: "I have a sprite sheet at assets/hero_spritesheet.png (8 columns, 4 rows). Row 1 is idle, row 2 is walk, row 3 is attack, row 4 is jump. Add these animations to my Player node."
Approach:
- Read the project to find the Player node's scene file and confirm it has an
AnimatedSprite2D child (or add one)
- Calculate frame regions: if the sheet is 1024x512 with 8 cols and 4 rows, each frame is 128x128
- Create a
.tres SpriteFrames resource with four named animations: "idle" (frames 0-7 from row 0), "walk" (row 1), "attack" (row 2), "jump" (row 3)
- For each frame, create an AtlasTexture sub-resource with region
Rect2(col*128, row*128, 128, 128)
- Assign the SpriteFrames to the AnimatedSprite2D's
sprite_frames property
- In the Player script, add animation state switching in
_physics_process:
# In player.gd
func _physics_process(delta):
var anim = $AnimatedSprite2D
if not is_on_floor():
anim.play("jump")
elif velocity.length() > 10:
anim.play("walk")
elif is_attacking:
anim.play("attack")
else:
anim.play("idle")
Output: Four animations correctly mapped to sprite sheet rows, with state machine logic driving transitions. The idle animation loops, attack plays once, walk/jump loop.
Example 2: Fixing a broken scene hierarchy for a platformer
User: "My player falls through the floor. The scene has a CharacterBody2D but collisions aren't working."
Approach:
- Read the player's
.tscn file and the level's .tscn file
- Check that CharacterBody2D has a CollisionShape2D child with a valid shape resource assigned
- Check that floor tiles/StaticBody2D nodes also have CollisionShape2D children
- Verify physics layers: player and floor must share at least one collision layer/mask bit
- Verify the player script calls
move_and_slide() (not just modifying position directly)
Common fix -- missing collision shape in the tscn:
[node name="CollisionShape2D" type="CollisionShape2D" parent="Player"]
shape = SubResource("RectangleShape2D_abc12")
[sub_resource type="RectangleShape2D" id="RectangleShape2D_abc12"]
size = Vector2(32, 64)
Output: Player collides with floor. Root cause was either a missing CollisionShape2D node, an unassigned shape resource, or mismatched collision layer bits.
Example 3: Creating a dissolve shader effect
User: "Add a dissolve effect to my enemy sprite that I can trigger from code when the enemy dies."
Approach:
- Create a shader file
dissolve.gdshader with a noise-based dissolve:
shader_type canvas_item;
uniform float dissolve_amount : hint_range(0.0, 1.0) = 0.0;
uniform sampler2D noise_texture;
uniform vec4 edge_color : source_color = vec4(1.0, 0.5, 0.0, 1.0);
uniform float edge_width = 0.05;
void fragment() {
vec4 tex = texture(TEXTURE, UV);
float noise = texture(noise_texture, UV).r;
float edge = smoothstep(dissolve_amount, dissolve_amount + edge_width, noise);
tex.a *= edge;
vec4 glow = edge_color * (1.0 - smoothstep(dissolve_amount - edge_width, dissolve_amount, noise));
COLOR = mix(glow, tex, edge);
}
- Create a NoiseTexture2D resource and assign it to the shader's
noise_texture uniform
- Apply the ShaderMaterial to the enemy's Sprite2D/AnimatedSprite2D node
- In the enemy script, tween the
dissolve_amount parameter:
func die():
var tween = create_tween()
tween.tween_property(
$Sprite2D.material, "shader_parameter/dissolve_amount",
1.0, 0.8
)
tween.tween_callback(queue_free)
Output: Enemy sprite dissolves from edges inward with an orange glow edge over 0.8 seconds, then the node is freed.
Best Practices
- Do: Always read the full
.tscn file before editing. Godot's text-based scene format has header sections ([gd_scene], [ext_resource], [sub_resource]) that must stay consistent with node references. Adding a node that references a nonexistent resource ID silently breaks the scene.
- Do: Match node paths in GDScript exactly to the scene tree. A script on
Player referencing $AnimatedSprite2D requires that node to be a direct child named exactly AnimatedSprite2D. Use get_node("Path/To/Node") for non-direct descendants.
- Do: Explicitly verify sprite frame selection when working with sprite sheets. The most common game dev agent failure is selecting visually wrong frames (e.g., walk frames assigned to attack animation). Count grid positions carefully.
- Do: Use Godot's signal system for event-driven communication between nodes rather than direct method calls across distant parts of the tree. This keeps coupling low and matches Godot's design patterns.
- Avoid: Adding nodes at the wrong tree depth. A
CollisionShape2D must be a direct child of a physics body (CharacterBody2D, StaticBody2D, RigidBody2D), not a grandchild or sibling. Check the parent field in .tscn entries.
- Avoid: Modifying
position directly on physics bodies for movement. Use velocity + move_and_slide() for CharacterBody2D, or apply_force()/apply_impulse() for RigidBody2D. Direct position changes bypass the physics engine and cause tunneling.
Error Handling
| Error Pattern |
Likely Cause |
Fix |
| "Invalid get index 'sprite_frames' on base Sprite2D" |
Used Sprite2D instead of AnimatedSprite2D |
Change the node type to AnimatedSprite2D |
| Scene loads but viewport is empty |
Nodes exist but are positioned off-screen or have zero scale |
Check position, scale, and visible properties; verify camera is targeting the right area |
| "Node not found: $NodeName" |
Script references a node that doesn't exist at that path in the scene tree |
Cross-reference the script's node path with the actual .tscn hierarchy |
| Collision not detected |
Missing CollisionShape2D, shape resource not assigned, or collision layer/mask mismatch |
Verify shape assignment and that layer bits overlap between interacting bodies |
| Shader compiles but renders black |
Uniform texture not assigned, or UV coordinates incorrect |
Ensure all sampler2D uniforms have textures assigned in the material's shader parameters |
| Animation plays wrong frames |
AtlasTexture regions calculated incorrectly from sprite sheet |
Recalculate frame regions: verify sheet dimensions, column/row count, and frame order |
Limitations
- No live visual verification without user help. Unlike the GameDevBench evaluation setup with Godot's MCP server, a standard Claude session cannot capture editor screenshots or runtime video. The agent must rely on the user to provide visual feedback or describe what they see.
- 3D tasks are significantly harder. The paper found 3D graphics tasks have lower success rates due to spatial reasoning requirements (camera placement, lighting, 3D transforms). Expect to need more iteration cycles for 3D scene composition.
- Complex shader debugging is limited. Without seeing the rendered output, diagnosing visual shader artifacts (banding, z-fighting, incorrect normal mapping) requires the user to describe the visual problem precisely.
- Godot version sensitivity. Godot 4.x changed the scene format, GDScript syntax, and node APIs substantially from 3.x. Always confirm the project's Godot version from
project.godot before making edits. This skill targets Godot 4.x patterns.
- Large project navigation. Projects with 50+ scene files and deep inheritance chains require significant exploration before editing. Use the project's
project.godot autoload and main scene configuration as entry points.
Reference
Paper: GameDevBench: Evaluating Agentic Capabilities Through Game Development (Chi et al., 2026)
Key takeaway: Visual feedback loops (editor screenshots and runtime video capture) improve agent game development performance by ~14 percentage points. The dominant failure mode is not logic errors but multimodal asset misalignment -- wrong sprites, incorrect hierarchy depth, mismatched resource references. Prioritize verifying visual/structural correctness over code logic.
1---2name: gamedevbench-evaluating-agentic-capabilities3description: Agentic game development with visual feedback loops for Godot Engine projects. Applies the GameDevBench methodology: navigating scene hierarchies, editing multimodal assets (sprites, shaders, animations), and using screenshot/video feedback to verify changes visually. Trigger phrases: 'build a game in Godot', 'fix my Godot scene', 'add animation to my game character', 'edit this shader effect', 'set up sprite animations from a spritesheet', 'create a game UI with Godot'4---56# Agentic Game Development with Visual Feedback (GameDevBench)78This skill enables Claude to tackle game development tasks in Godot Engine using the agentic workflow and visual feedback mechanisms from GameDevBench (arXiv:2602.11103). The core insight: game development requires simultaneously navigating large codebases, understanding hierarchical scene graphs, and manipulating intrinsically multimodal assets (sprites, shaders, animations, audio). By incorporating screenshot feedback from the Godot editor and runtime video capture, agents improve from ~33% to ~48% task success -- a technique this skill applies to real Godot projects.910## When to Use1112- When the user asks to create, modify, or debug a Godot Engine project (GDScript, .tscn scenes, .tres resources)13- When working with sprite sheets and the user needs animation frames extracted, ordered, or assigned to an AnimatedSprite2D node14- When editing shader files (.gdshader) or visual shader parameters for effects like outlines, dissolves, or post-processing15- When building or restructuring a scene's node hierarchy (adding CollisionShape2D, Camera3D, UI containers, etc.)16- When the user has a game that "doesn't look right" and needs visual verification of scene composition17- When implementing gameplay logic that interconnects signals, physics layers, and node references across multiple files18- When porting a game tutorial (web or video) into a working Godot project1920## Key Technique2122**Multi-file, multimodal-aware editing with visual feedback loops.** GameDevBench found that game development tasks average 5 files modified and 106 lines changed per solution across 3.4 distinct file types -- far exceeding typical software engineering benchmarks. The critical differentiator is that errors are often *visual*, not logical: an agent might wire up correct gameplay code but select walking sprites instead of attack sprites, or attach a node at the wrong depth in the scene tree. Traditional text-only feedback (compiler errors, test output) cannot catch these mistakes.2324**Two feedback mechanisms close this gap.** First, *editor screenshot feedback*: capturing a screenshot of the Godot editor after changes shows the scene graph structure, the inspector panel with node properties, and the 2D/3D viewport with the current visual state. This lets the agent verify node hierarchy, property values, and spatial layout. Second, *runtime video feedback*: using Godot's built-in recording to capture a short gameplay clip reveals temporal dynamics -- whether animations play correctly, physics behave as expected, and camera movement tracks properly. The paper found that either mechanism alone delivers most of the improvement; combining them yields marginal additional gains.2526**The practical implication for coding agents:** after each significant edit pass, take a visual checkpoint. Compare the visual state against the task requirements. If the visual output diverges from intent, diagnose whether the issue is structural (wrong node hierarchy), referential (wrong asset path or sprite frame), or parametric (wrong property values). This feedback loop catches the dominant failure mode in game development: correct code structure with incorrect multimodal asset integration.2728## Step-by-Step Workflow29301. **Inventory the project structure.** Scan the Godot project directory for `project.godot`, all `.tscn` scene files, `.gd` scripts, `.gdshader` shaders, and asset directories (sprites, audio, fonts). Map the dependency graph: which scenes instance other scenes, which scripts attach to which nodes.31322. **Parse the target scene's node tree.** Read the relevant `.tscn` file and reconstruct the node hierarchy. Godot's tscn format is text-based -- each `[node]` entry specifies `name`, `type`, `parent` (path relative to root), and property overrides. Identify the exact insertion point for new nodes and the parent-child relationships.33343. **Catalog available assets.** List all image files (.png, .svg), audio files (.wav, .ogg), font files (.ttf), and resource files (.tres). For sprite sheets, determine the grid dimensions and which frames correspond to which animation states (idle, walk, attack, jump). This prevents the most common agent failure: selecting wrong sprite frames.35364. **Plan the multi-file edit.** Game tasks typically require coordinated changes across scene files (.tscn), scripts (.gd), resource files (.tres), and sometimes shaders (.gdshader). Draft which files change, what nodes are added/modified, and what signals need connecting. Verify that node paths used in scripts match the actual scene tree paths.37385. **Edit scene files with correct hierarchy.** When adding nodes to `.tscn`, ensure:39 - The `parent` path is correct (use `.` for root children, `NodeA` for children of NodeA, `NodeA/NodeB` for deeper nesting)40 - Required companion nodes exist (e.g., a `CharacterBody2D` needs a `CollisionShape2D` child)41 - Resource references (`ExtResource` / `SubResource`) point to valid IDs declared in the file header42436. **Write or modify GDScript with proper node references.** Use `$NodeName` or `get_node("path")` with paths that match the actual scene tree. Connect signals either in the scene file (`[connection]` entries) or via code (`node.signal_name.connect(callable)`). Verify that exported variables (`@export`) match the types expected by the inspector.44457. **Handle sprite animations correctly.** For `AnimatedSprite2D`, create a `SpriteFrames` resource with named animations. Each animation needs frames in the correct order, appropriate FPS, and loop settings. For sprite sheets, use `AtlasTexture` resources with correct `region` Rect2 values to extract individual frames. Double-check frame selection against the visual content of the sprite sheet.46478. **Verify with visual feedback.** If the user can provide a screenshot of the Godot editor or a recording of gameplay, use it to verify:48 - Node hierarchy appears correctly in the Scene dock49 - Properties in the Inspector match expected values50 - The 2D/3D viewport shows correct spatial arrangement51 - Animations play with correct frames and timing52 If no visual feedback is available, mentally simulate the visual output from the scene data and flag potential discrepancies.53549. **Run deterministic checks.** If tests exist (test.gd / test.tscn), describe how to execute them via `godot --headless --path . -s test.gd`. Check for node existence, property values, collision layer setup, and signal connections. Parse test output to identify remaining failures.555610. **Iterate on failures with targeted fixes.** When something fails, classify the error type:57 - **Structural:** Wrong node type, missing child node, incorrect parent path -- fix the .tscn file58 - **Referential:** Wrong asset path, wrong sprite frame, broken signal connection -- fix the resource reference or path string59 - **Parametric:** Wrong property value (scale, position, color, physics layer) -- fix the specific property60 - **Logical:** Script behavior incorrect -- fix the .gd file logic61 Apply the minimal fix for the specific error category rather than rewriting broadly.6263## Concrete Examples6465**Example 1: Adding a character animation from a sprite sheet**6667User: "I have a sprite sheet at `assets/hero_spritesheet.png` (8 columns, 4 rows). Row 1 is idle, row 2 is walk, row 3 is attack, row 4 is jump. Add these animations to my Player node."6869Approach:701. Read the project to find the Player node's scene file and confirm it has an `AnimatedSprite2D` child (or add one)712. Calculate frame regions: if the sheet is 1024x512 with 8 cols and 4 rows, each frame is 128x128723. Create a `.tres` SpriteFrames resource with four named animations: "idle" (frames 0-7 from row 0), "walk" (row 1), "attack" (row 2), "jump" (row 3)734. For each frame, create an AtlasTexture sub-resource with region `Rect2(col*128, row*128, 128, 128)`745. Assign the SpriteFrames to the AnimatedSprite2D's `sprite_frames` property756. In the Player script, add animation state switching in `_physics_process`:7677```gdscript78# In player.gd79func _physics_process(delta):80 var anim = $AnimatedSprite2D81 if not is_on_floor():82 anim.play("jump")83 elif velocity.length() > 10:84 anim.play("walk")85 elif is_attacking:86 anim.play("attack")87 else:88 anim.play("idle")89```9091Output: Four animations correctly mapped to sprite sheet rows, with state machine logic driving transitions. The idle animation loops, attack plays once, walk/jump loop.9293**Example 2: Fixing a broken scene hierarchy for a platformer**9495User: "My player falls through the floor. The scene has a CharacterBody2D but collisions aren't working."9697Approach:981. Read the player's `.tscn` file and the level's `.tscn` file992. Check that CharacterBody2D has a CollisionShape2D child with a valid shape resource assigned1003. Check that floor tiles/StaticBody2D nodes also have CollisionShape2D children1014. Verify physics layers: player and floor must share at least one collision layer/mask bit1025. Verify the player script calls `move_and_slide()` (not just modifying `position` directly)103104Common fix -- missing collision shape in the tscn:105```106[node name="CollisionShape2D" type="CollisionShape2D" parent="Player"]107shape = SubResource("RectangleShape2D_abc12")108109[sub_resource type="RectangleShape2D" id="RectangleShape2D_abc12"]110size = Vector2(32, 64)111```112113Output: Player collides with floor. Root cause was either a missing CollisionShape2D node, an unassigned shape resource, or mismatched collision layer bits.114115**Example 3: Creating a dissolve shader effect**116117User: "Add a dissolve effect to my enemy sprite that I can trigger from code when the enemy dies."118119Approach:1201. Create a shader file `dissolve.gdshader` with a noise-based dissolve:121122```glsl123shader_type canvas_item;124uniform float dissolve_amount : hint_range(0.0, 1.0) = 0.0;125uniform sampler2D noise_texture;126uniform vec4 edge_color : source_color = vec4(1.0, 0.5, 0.0, 1.0);127uniform float edge_width = 0.05;128129void fragment() {130 vec4 tex = texture(TEXTURE, UV);131 float noise = texture(noise_texture, UV).r;132 float edge = smoothstep(dissolve_amount, dissolve_amount + edge_width, noise);133 tex.a *= edge;134 vec4 glow = edge_color * (1.0 - smoothstep(dissolve_amount - edge_width, dissolve_amount, noise));135 COLOR = mix(glow, tex, edge);136}137```1381392. Create a NoiseTexture2D resource and assign it to the shader's `noise_texture` uniform1403. Apply the ShaderMaterial to the enemy's Sprite2D/AnimatedSprite2D node1414. In the enemy script, tween the `dissolve_amount` parameter:142143```gdscript144func die():145 var tween = create_tween()146 tween.tween_property(147 $Sprite2D.material, "shader_parameter/dissolve_amount",148 1.0, 0.8149 )150 tween.tween_callback(queue_free)151```152153Output: Enemy sprite dissolves from edges inward with an orange glow edge over 0.8 seconds, then the node is freed.154155## Best Practices156157- **Do:** Always read the full `.tscn` file before editing. Godot's text-based scene format has header sections (`[gd_scene]`, `[ext_resource]`, `[sub_resource]`) that must stay consistent with node references. Adding a node that references a nonexistent resource ID silently breaks the scene.158- **Do:** Match node paths in GDScript exactly to the scene tree. A script on `Player` referencing `$AnimatedSprite2D` requires that node to be a *direct child* named exactly `AnimatedSprite2D`. Use `get_node("Path/To/Node")` for non-direct descendants.159- **Do:** Explicitly verify sprite frame selection when working with sprite sheets. The most common game dev agent failure is selecting visually wrong frames (e.g., walk frames assigned to attack animation). Count grid positions carefully.160- **Do:** Use Godot's signal system for event-driven communication between nodes rather than direct method calls across distant parts of the tree. This keeps coupling low and matches Godot's design patterns.161- **Avoid:** Adding nodes at the wrong tree depth. A `CollisionShape2D` must be a direct child of a physics body (`CharacterBody2D`, `StaticBody2D`, `RigidBody2D`), not a grandchild or sibling. Check the `parent` field in `.tscn` entries.162- **Avoid:** Modifying `position` directly on physics bodies for movement. Use `velocity` + `move_and_slide()` for CharacterBody2D, or `apply_force()`/`apply_impulse()` for RigidBody2D. Direct position changes bypass the physics engine and cause tunneling.163164## Error Handling165166| Error Pattern | Likely Cause | Fix |167|---|---|---|168| "Invalid get index 'sprite_frames' on base Sprite2D" | Used Sprite2D instead of AnimatedSprite2D | Change the node type to AnimatedSprite2D |169| Scene loads but viewport is empty | Nodes exist but are positioned off-screen or have zero scale | Check `position`, `scale`, and `visible` properties; verify camera is targeting the right area |170| "Node not found: $NodeName" | Script references a node that doesn't exist at that path in the scene tree | Cross-reference the script's node path with the actual .tscn hierarchy |171| Collision not detected | Missing CollisionShape2D, shape resource not assigned, or collision layer/mask mismatch | Verify shape assignment and that layer bits overlap between interacting bodies |172| Shader compiles but renders black | Uniform texture not assigned, or UV coordinates incorrect | Ensure all sampler2D uniforms have textures assigned in the material's shader parameters |173| Animation plays wrong frames | AtlasTexture regions calculated incorrectly from sprite sheet | Recalculate frame regions: verify sheet dimensions, column/row count, and frame order |174175## Limitations176177- **No live visual verification without user help.** Unlike the GameDevBench evaluation setup with Godot's MCP server, a standard Claude session cannot capture editor screenshots or runtime video. The agent must rely on the user to provide visual feedback or describe what they see.178- **3D tasks are significantly harder.** The paper found 3D graphics tasks have lower success rates due to spatial reasoning requirements (camera placement, lighting, 3D transforms). Expect to need more iteration cycles for 3D scene composition.179- **Complex shader debugging is limited.** Without seeing the rendered output, diagnosing visual shader artifacts (banding, z-fighting, incorrect normal mapping) requires the user to describe the visual problem precisely.180- **Godot version sensitivity.** Godot 4.x changed the scene format, GDScript syntax, and node APIs substantially from 3.x. Always confirm the project's Godot version from `project.godot` before making edits. This skill targets Godot 4.x patterns.181- **Large project navigation.** Projects with 50+ scene files and deep inheritance chains require significant exploration before editing. Use the project's `project.godot` autoload and main scene configuration as entry points.182183## Reference184185**Paper:** [GameDevBench: Evaluating Agentic Capabilities Through Game Development](https://arxiv.org/abs/2602.11103v1) (Chi et al., 2026)186187**Key takeaway:** Visual feedback loops (editor screenshots and runtime video capture) improve agent game development performance by ~14 percentage points. The dominant failure mode is not logic errors but *multimodal asset misalignment* -- wrong sprites, incorrect hierarchy depth, mismatched resource references. Prioritize verifying visual/structural correctness over code logic.