§ How to · with Picoo
How to make a Roblox obby (with AI)
By Sametcan Tasgiran, Founder & Developer·Published ·Updated
An obby is 95% geometry, which is why it fails in a way scripts do not: it looks finished and cannot be completed.
The whole course lands in Explorer in EDIT mode — visible, movable, saveable before you ever press Play — and every jump is checked against what a default Roblox character can actually clear.
Numbered checkpoints
Touch a pad, that stage is locked in. Dying or falling puts you back there, not at the start.
Six obstacle types, cycling
Plain jumps, stepping stones over lava, moving platforms, spinning kill bars, disappearing platforms, a narrow beam — so a 10-stage obby never repeats the same challenge twice in a row.
Linear or tower
A ground course, or a vertical switchback climb for an obby tower.
Three difficulties
easy / normal / hard changes platform size and gap — within what is physically jumpable.
Themes
rainbow, neon, lava, candy, ice, forest, space. "Love theme, hearts and pink" resolves to candy.
Extend by copying
Behaviour is found by NAME: duplicate any Mover/Fade/Kill/Checkpoint part in Explorer and it works, no scripting.
Files Picoo ships for this prompt
3 files · 430 lines · ~45s · 2 credit
Obby (course tree)
169 instances for a 15-stage course — landings, checkpoints, lava slabs, movers, spinners, beam, finish podium. Built in ONE bridge call, visible in Edit mode.
169 lines
ObbyRuntime
Finds the parts by name and wires checkpoints, kills, movers, spinners, void-falls and the finish.
261 lines
SpawnLocation
Start pad spawn, positioned at stage 1.
1 lines
Sample output: ServerScriptService.ObbyRuntime
-- Respawn at the checkpoint you reached, not at the start.
local function placeAtCheckpoint(plr: Player, char: Model)
local target = checkpoints[stageOf[plr] or 1] or checkpoints[1]
if not target then return end
local hrp = char:WaitForChild("HumanoidRootPart", 10)
if not hrp then return end
task.wait(0.15)
if char.Parent then
char:PivotTo(target.CFrame * CFrame.new(0, 5, 0))
end
end
-- Checkpoints capture FORWARD only, so walking back does not un-progress you.
for i, cp in ipairs(checkpoints) do
cp.Touched:Connect(function(hit)
local plr = playerFromHit(hit)
if not plr then return end
local prev = lastTouch[plr] -- Touched fires once per touching PART
if prev and tick() - prev < 0.35 then return end
lastTouch[plr] = tick()
if (stageOf[plr] or 1) >= i then return end
stageOf[plr] = i
end)
endBuilding a Roblox obby
Obby is the fastest-shipping Roblox genre and the easiest to get quietly wrong. Scripts fail loudly — an error in Output, a red line. Geometry fails silently: the course renders beautifully and simply cannot be finished, and the player blames themselves before they blame the game.
So the numbers come first. A default Roblox character (WalkSpeed 16, JumpPower 50, gravity 196.2) clears roughly 8.2 studs of AIR on a flat jump — edge to edge, not centre to centre. That distinction is where most generated obbies die: spacing platforms 15 studs apart sounds generous until you notice the platforms are 10 wide, leaving 5 studs of gap, and that shrinking the platforms as difficulty ramps quietly pushes that gap past what anyone can jump. Climbing costs reach too, because you land on the descending half of the arc: 5 studs of gap buys about 6 studs of rise, 7 studs buys about 3.
Picoo checks that before shipping. Every consecutive jump in the generated course is measured against the character's real budget across eight layout and difficulty combinations — a course that cannot be completed does not leave the builder.
The course itself is built as a single instance tree, so it appears in Explorer in EDIT mode: 169 instances for a 15-stage obby that you can move, recolour and save without pressing Play. One server script then finds those parts by name and wires the behaviour — checkpoints that capture forward only, kill parts, platforms that carry you (surface velocity, because a CFrame-moved anchored part slides out from under the player), spinning bars, fading platforms, void-falls measured relative to your own checkpoint, and a finish podium that banks a win and sends you back to stage 1.
Because behaviour is keyed to names rather than to a fixed list, extending the course is a copy-paste job: duplicate a Mover platform in Explorer and it moves; duplicate a Kill part and it kills. No new scripts, no registry to update.
See more on the Luau generator, the game builder, or browse the full blog.
Frequently asked
How far can a Roblox character actually jump?+
With the defaults — WalkSpeed 16, JumpPower 50, gravity 196.2 — a flat jump clears about 8.2 studs of AIR, edge to edge. Not centre to centre: two 10-stud platforms 15 studs apart leave only 5 studs of gap. Climbing costs reach, because you land on the descending side of the arc: 5 studs of gap buys about 6 studs of rise, 7 studs of gap buys only about 3.
Why do so many generated obbies feel impossible?+
Because the gap is measured wrong. Spacing platforms by centre distance looks even in the viewport and silently creates unjumpable jumps as platforms shrink. Picoo checks every consecutive jump against the character's real budget before shipping the course — the test runs on eight layout/difficulty combinations.
Do players lose progress when they die?+
No. The stage you reached is stored server-side and you respawn at that checkpoint. Falling off is caught too: dropping more than 40 studs below your own checkpoint counts as a fall, which is why a tower obby does not leave you stranded on stage 3 after a long drop.
Can I make it taller instead of longer?+
Yes — layout "tower" folds the same course into vertical switchbacks. Per-platform climb is capped by difficulty (4 studs on easy down to 2.5 on hard) because a jump that has to climb has less horizontal reach.
How do I add more stages after it is built?+
Duplicate the parts. The runtime finds behaviour by name prefix — Mover*, Fade*, Kill*, Spinner*, Checkpoint<N> — so a copied moving platform is a working moving platform with no new code. Or re-run with a higher stage count (3-25).
Related Picoo prompts
Roblox checkpoint system
4 files · 140 lines · 36 seconds · 1 credit. RespawnLocation-based, no custom respawn script needed.
Roblox currency system
4 files · 150 lines · 44 seconds · 1 credit. Cash + Gems + premium currency by default.
How to use Roblox DataStore the right way
3 files · 140 lines · 36 seconds · 1 credit. Drop-in save service for any game.