From better-godot-mcp
Provides systematic decision trees for debugging Godot issues in physics (collisions, bodies), signals (connections, emits), rendering (visibility), navigation (paths), and input.
How this skill is triggered — by the user, by Claude, or both
Slash command
/better-godot-mcp:debug-issue [symptom description][symptom description]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Systematic debugging using domain-specific decision trees. Start by identifying the symptom category, then follow the corresponding tree.
Systematic debugging using domain-specific decision trees. Start by identifying the symptom category, then follow the corresponding tree.
Map user's symptom to the right tree:
| Symptom keywords | Category |
|---|---|
| "pass through", "no collision", "overlap", "stuck", "slides off" | Physics |
| "signal not firing", "not connected", "callback not called" | Signals |
| "invisible", "not showing", "behind", "flickering", "wrong color" | Rendering |
| "not moving to target", "path wrong", "stuck on nav", "no path" | Navigation |
| "key not working", "input ignored", "wrong button", "double input" | Input |
Check in this order -- each step is the most common cause at that point:
Collision layer/mask mismatch (most common):
physics(action="layers")nodes(action="get_property", scene_path="<scene>.tscn", name="<body>", property="collision_layer")
nodes(action="get_property", scene_path="<scene>.tscn", name="<body>", property="collision_mask")
collision_mask has a bit that matches B's collision_layer. Both must be set correctly.Missing CollisionShape2D/3D:
scenes(action="info", scene_path="<scene>.tscn")Wrong body type:
StaticBody2D: immovable (walls, floors)CharacterBody2D: player/NPC movement via move_and_slide()RigidBody2D: physics-driven (projectiles, debris)RigidBody2D for a player character, then fighting the physics engineScript velocity issues:
scripts(action="read", script_path="res://scripts/<name>.gd")velocity is being set before move_and_slide()_physics_process (not _process)delta is used for frame-independent movementConnection exists?
signals(action="list", scene_path="<scene>.tscn")Signature match?
signal health_changed(new_hp: int) requires handler func _on_health_changed(new_hp: int)Signal emitted?
print("signal emitted") before emit_signal() / signal.emit()Callable valid?
connect() runsVisibility:
visible property = false? Check node and ALL parents (parent invisible = children invisible)modulate.a = 0? (fully transparent)Z-index:
z_as_relative = true means z_index is relative to parentMaterial/shader:
Viewport issues:
render_target_update_modeenabled = true per viewportNavigationRegion setup:
NavigationRegion2D/3D must exist in sceneNavigationPolygon/NavigationMesh resource assignedNavigation mesh baked?
bake_navigation_mesh())NavigationAgent config:
path_desired_distance: how close before moving to next path pointtarget_desired_distance: how close to target before stoppingPath calculation:
NavigationAgent.set_target_position() then check get_next_path_position()Input Map:
input_map(action="list")project.godot for [input] sectionAction name match:
Input.is_action_pressed("jump") -- exact string match requiredEvent processing:
_input() vs _unhandled_input() -- if another node consumes the event, _unhandled_input never firesset_process_input(false) disables _input() on that nodeConflicts:
For any category:
scenes(action="info", scene_path="<scene>.tscn")scripts(action="read", script_path="res://scripts/<name>.gd")nodes(action="get_property", scene_path="<scene>.tscn", name="<node_path>", property="<name>")project(action="run", scene_path="<scene>.tscn") and check output for errorsnpx claudepluginhub n24q02m/better-godot-mcpDebugs Godot errors and crashes including parser/syntax issues, identifier scope problems, null references, and runtime failures with GDScript fixes.
Debugs Godot 4.3+ projects in GDScript and C# using print techniques, breakpoints, signal tracing, profiler, scene inspection, and common error fixes.
Runs a disciplined debug loop for Godot/Summer projects: script errors → diagnostics → console → debugger → hypothesis → fix → verify. Use when the user reports crashes, errors, freezes, or unexpected behavior.