3D Parkour World with Racing Bots

Shared Jul 19, 2026, 5:41 AM · Updated Jul 19, 2026, 8:15 AM

Make a 3D parkour world where you compete against bots for time. There should be 3 races in the world, and you can start any of the races by walking over to their start point. Use the assets in Kenny_Platformer_Kit/ to build your world.

Claude Fable 5·

I'll build this from scratch. Let me first inspect the Kenney kit model dimensions so I can lay out the world correctly.

Now let me create the remaining scripts and the player scene.

Now set up input actions:

Now the player scene, and an update to bot.gd for name labels:

The scene saved, but the race scripts failed to parse in the subprocess (class_name cache issue), so script attachments may be missing. Let me check:

The game.gd and race.gd scripts failed to attach due to the parse errors. I'll fix the .tscn directly. Let me look at the relevant sections:

The scene saved, but game.gd and race.gd failed to attach in the subprocess (class_name cache not available headless). I'll patch the .tscn directly:

The first run likely spent time importing the GLB assets. Let me retry:

The editor overwrote my input actions when it saved project settings (it had a stale in-memory copy). Let me check and re-add them through the editor:

The editor's in-memory input map may not have refreshed yet, but the game process reads project.godot from disk. Let me playtest:

These errors may be stale. Let me clear logs, verify project.godot still has the input map on disk, and re-run:

The editor keeps overwriting project.godot with its stale in-memory settings. The robust fix: register the input actions at runtime in code instead:

Only the integer division warning remains. Let me fix that, and add temporary prints to verify race flow end-to-end:

No print output captured. Let me verify the race trigger flow deterministically with a test:

The world loads fine headless. Let me instrument the test to find where it stalls:

The full race flow verified end-to-end in simulation: countdown triggers on the start pad, bots run their paths, timer counts, finish produces standings, and fall-respawn works. Note the editor kept reverting my project.godot input-map edits, so the player script registers the input actions at runtime instead — this is robust regardless of project settings.

Here's what I built:

The World — res://scenes/world.tscn (set as main scene)

A central hub plaza built from Kenney grass blocks, decorated with trees, flowers, mushrooms and rocks. Three flag pads sit on the plaza edges — walk onto a flag pad to start that race (3-2-1 countdown, then GO).

Three courses, all built from the Kenney Platformer Kit with accurate trimesh collision:

  1. Meadow Dash (easy, east) — flat grass-block sprint with small gap jumps, curving to a finish platform.
  2. Snowy Ascent (medium, west) — snow blocks climbing steadily upward with gaps, ending on a snowy summit.
  3. Sky Gauntlet (hard, north) — small floating platforms over the void requiring precise jumps to a floating finish island with a jewel.

Competing against bots

  • Each race has 3 named bot racers (Kenney characters like oobi/oodi/ooli with floating name labels) that run the course at different speeds when the race starts.
  • On finish you get a standings board ranking you vs. the bots by time, with a headline for your placement.
  • Bot difficulty scales per course — Meadow Dash bots are fast, Sky Gauntlet bots are slower but the course is harder.

Systems

  • Player (player.gd): third-person CharacterBody3D with mouse-look SpringArm3D camera, WASD + Space jump, model turns to face movement.
  • Race manager (game.gd): state machine (free-roam → countdown → racing → results), race timer HUD, fall detection that respawns you at the race start (mid-race) or the hub (free roam), and auto-return to the hub after results.
  • Bots (bot.gd): waypoint-path ghosts with hop arcs across gaps.

Press Esc to release the mouse. Just hit play — you spawn in the hub with all three race pads labeled around you.

3D Parkour World with Racing Bots · Ziva | Ziva