Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Set up a Godot 4.x 3D scene: Node3D transforms, Camera3D, lighting (DirectionalLight3D/OmniLight3D), WorldEnvironment for sky/ambient/tonemap/post, MeshInstance3D materials, and GridMap for tile-based 3D levels. Use when building a 3D scene in a Godot project, placing cameras/lights, configuring environment and post-processing, or working with Node3D/.tscn 3D content and GridMap.
.claude/skills/gamedev-skills-godot-3d-essentials/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 76% | 0% |
| case-16 | ✓→✗ | ▼ Worse | 49% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 60% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 66% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 49% | 0% |
Assemble a working 3D scene: transforms, camera, lights, environment/post, materials, and GridMap blockouts. Targets Godot 4.7.
Camera3D, adding lights, settingup a WorldEnvironment (sky, ambient, tonemap, glow/SSAO), assigning materials, or building levels with GridMap.
When not to use: writing spatial shaders → godot-shaders; 3D physics bodies and raycasts → godot-physics; character animation blending → godot-animation; full FPS template → the fps-shooter genre skill.
Node3D with a Transform3D (position, rotation basis, scale).Move with global_position, rotate with rotate_y(angle) or look_at(target).
Camera3D. Mark it current (or call make_current()); set fov, near,far. Parent it to a rig/pivot for orbit or follow cameras.
DirectionalLight3D is the sun; OmniLight3D/SpotLight3D arelocal. Enable shadows per light. Without lights and ambient, surfaces render black.
WorldEnvironment with an Environment resource: background (sky/color),ambient light, tonemap, and post (glow, SSAO, fog, adjustments).
StandardMaterial3D or a ShaderMaterial) onMeshInstance3D.
GridMap, which places MeshLibrary items on a 3D grid(the 3D analog of a tilemap).
gdscriptextends Camera3D @export var target: Node3D @export var offset := Vector3(0, 4, 8) @export var smooth := 6.0 func _physics_process(delta: float) -> void: if target == null: return var desired := target.global_position + offset global_position = global_position.lerp(desired, smooth * delta) # smooth follow look_at(target.global_position, Vector3.UP) # face the target
gdscriptfunc _ready() -> void: var sun := DirectionalLight3D.new() sun.rotation_degrees = Vector3(-45, -30, 0) sun.shadow_enabled = true add_child(sun) var we := WorldEnvironment.new() var env := Environment.new() env.background_mode = Environment.BG_SKY env.sky = Sky.new() env.sky.sky_material = ProceduralSkyMaterial.new() env.ambient_light_source = Environment.AMBIENT_SOURCE_SKY env.tonemap_mode = Environment.TONE_MAPPER_FILMIC env.glow_enabled = true we.environment = env add_child(we)
gdscriptfunc tint_mesh(mesh: MeshInstance3D, color: Color) -> void: var mat := StandardMaterial3D.new() mat.albedo_color = color mat.metallic = 0.0 mat.roughness = 0.6 mat.emission_enabled = true mat.emission = color * 0.3 mesh.material_override = mat # overrides the mesh's surface materials
gdscript@onready var grid: GridMap = $GridMap # cell_size + mesh_library set in the editor func build_floor(width: int, depth: int, item_id: int) -> void: for x in width: for z in depth: # set_cell_item(Vector3i cell, int item, orientation = 0) grid.set_cell_item(Vector3i(x, 0, z), item_id)
DirectionalLight3D and/or aWorldEnvironment with ambient/sky. New scenes have neither by default.
Camera3D is current. Setcurrent = true or make_current(); only one camera renders per viewport.
position/rotation are relative to theparent; global_position/global_transform are world space. Mixing them under a rotated parent gives surprising results. look_at uses global coordinates.
scale on a Node3D distorts child collisionsand lights; prefer scaling the mesh asset or using uniform scale.
from/up in look_at. look_at(target, up) — a target equal to thenode's position, or an up parallel to the look direction, produces NaNs/flips.
MeshLibrary places nothing. Create a MeshLibrary (from scenes)and assign it; set_cell_item(cell, -1) clears a cell.
tonemap_mode and glow thresholds; raw emissive valuesbloom hard under filmic tonemapping.
Environment/post-processing options, MeshLibrary creation, and ReflectionProbe/ LightmapGI lighting, read references/scene-and-environment.md.
godot-physics — 3D bodies, areas, and raycasts.godot-shaders — spatial shaders for custom 3D surfaces.godot-animation — AnimationTree for 3D characters.camera-systems — third-person orbit / first-person look rigs, framing, and collision.performance-optimization — keep 3D scenes within frame budget (draw calls, lights, LOD).fps-shooter — composes 3D movement, input, and AI into a game.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 7,970 | 5,495 | -31% | 1 | 1 | 0% | 1,665 | 2,669 | +60% | 0 | 0 | — |
case-02 | pass→pass | 9,062 | 6,705 | -26% | 1 | 1 | 0% | 1,679 | 2,793 | +66% | 0 | 0 | — |
case-03 | pass→pass | 10,282 | 6,798 | -34% | 1 | 1 | 0% | 1,986 | 2,969 | +49% | 0 | 0 | — |
case-04 | pass→pass | 13,418 | 11,626 | -13% | 1 | 1 | 0% | 2,844 | 3,895 | +37% | 0 | 0 | — |
case-05 | fail→pass | 7,479 | 4,948 | -34% | 1 | 1 | 0% | 1,453 | 2,552 | +76% | 0 | 0 | — |
case-06 | pass→pass | 10,098 | 8,007 | -21% | 1 | 1 | 0% | 1,685 | 2,914 | +73% | 0 | 0 | — |
case-07 | pass→pass | 7,009 | 3,199 | -54% | 1 | 1 | 0% | 1,179 | 2,204 | +87% | 0 | 0 | — |
case-08 | pass→pass | 13,154 | 6,152 | -53% | 1 | 1 | 0% | 2,241 | 2,657 | +19% | 0 | 0 | — |
case-09 | pass→pass | 3,021 | 2,166 | -28% | 1 | 1 | 0% | 563 | 1,940 | +245% | 0 | 0 | — |
case-10 | pass→pass | 14,282 | 12,001 | -16% | 1 | 1 | 0% | 2,354 | 3,335 | +42% | 0 | 0 | — |
case-11 | pass→pass | 10,596 | 9,746 | -8% | 1 | 1 | 0% | 1,846 | 3,198 | +73% | 0 | 0 | — |
case-12 | pass→pass | 11,019 | 12,475 | +13% | 1 | 1 | 0% | 2,158 | 3,732 | +73% | 0 | 0 | — |
case-13 | pass→pass | 2,887 | 2,968 | +3% | 1 | 1 | 0% | 419 | 2,072 | +395% | 0 | 0 | — |
case-14 | pass→pass | 7,235 | 4,507 | -38% | 1 | 1 | 0% | 1,384 | 2,422 | +75% | 0 | 0 | — |
case-15 | pass→pass | 7,463 | 4,872 | -35% | 1 | 1 | 0% | 1,495 | 2,431 | +63% | 0 | 0 | — |
case-16 | pass→fail | 8,296 | 4,649 | -44% | 1 | 1 | 0% | 1,653 | 2,456 | +49% | 0 | 0 | — |
case-17 | pass→pass | 10,097 | 6,050 | -40% | 1 | 1 | 0% | 1,913 | 2,725 | +42% | 0 | 0 | — |
case-18 | pass→pass | 3,911 | 2,654 | -32% | 1 | 1 | 0% | 626 | 1,994 | +219% | 0 | 0 | — |
case-19 | pass→pass | 19,177 | 19,146 | -0% | 1 | 1 | 0% | 3,603 | 5,820 | +62% | 0 | 0 | — |
case-20 | pass→pass | 12,957 | 11,714 | -10% | 1 | 1 | 0% | 2,429 | 3,708 | +53% | 0 | 0 | — |
case-21 | pass→pass | 13,084 | 9,156 | -30% | 1 | 1 | 0% | 2,584 | 3,300 | +28% | 0 | 0 | — |
case-22 | pass→pass | 5,003 | 2,824 | -44% | 1 | 1 | 0% | 794 | 2,073 | +161% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of 0 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/2/2026 | 0% |
Other measured skills in the registry, with their headline benchmark lift.