§ 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 gap is spaced for 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/Spinner part in Explorer and it works, no scripting.

Files Picoo ships for this prompt

5 files · 1166 lines · one recipe call

Workspace/Obby (course tree)

120 instances for the default 10-stage course (169 at 15 stages): landings, checkpoints, lava slabs, movers, spinners, beam, finish podium. Built in ONE bridge call, visible in Edit mode.

instance

ServerScriptService/ObbyRuntime

Finds the parts by name and wires checkpoints, kills, movers, spinners, fading platforms, void-falls and the finish.

303 lines

Workspace/SpawnLocation

Spawn on the start pad, just before stage 1.

instance

ReplicatedStorage/PicooFeedback

Shared game-feel module the runtime calls for the checkpoint and finish effects.

851 lines

StarterPlayer/StarterPlayerScripts/PicooFeedbackClient

Loads the client half of PicooFeedback for every player.

12 lines

Sample output: ServerScriptService/ObbyRuntime

-- ---------- respawn at the reached checkpoint ----------
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

-- (excerpt: the player hooks in between are left out)

-- ---------- checkpoint capture (forward only — no farming by walking back) ----------
local lastTouch: { [Player]: number } = {}
for i, cp in ipairs(checkpoints) do
	cp.Touched:Connect(function(hit)
		local plr = playerFromHit(hit)
		if not plr then return end
		-- debounce: Touched fires once per touching PART, so a single step onto
		-- a pad raises it 5-30 times
		local prev = lastTouch[plr]
		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
		local st = statsOf(plr)
		if st then
			st.Value = i
		end
		-- Reaching a checkpoint is the only progress an obby has, and it used
		-- to be a silent number in the leaderboard.
		Feedback.checkpoint(plr, cp, { label = "STAGE " .. i, color = cp.Color })
	end)
end

Building 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 builds that into the recipe. Base gaps are 3 studs of air on easy, 5 on normal and 5.5 on hard, stages where platforms shrink stay under the 8.2-stud ceiling, and a test builds eight courses across both layouts and all three difficulties and checks every consecutive jump against the budget.

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 AI Luau script writer, the 3D model generator and the game builder, read how Picoo compares with ChatGPT, 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. obby_course spaces every gap edge to edge from the character's jump budget, and a test builds eight courses covering both layouts and all three difficulties and checks every consecutive jump against that budget.

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* — so a copied moving platform is a working moving platform with no new code. Checkpoints are read by number, Checkpoint1 up to the STAGES value at the top of ObbyRuntime, so a new checkpoint needs the next number and a higher STAGES. For a longer course from the start, ask for more stages: the recipe builds 3 to 25.

Related Picoo prompts