๐Ÿ’ฅ Roblox Obstacle Course ยท Glitch World ยท 30-Second Collapse ยท See All Episodes
๐Ÿ’ฅ Intermediate ยท Tense ยท Glitch World ยท Boss Level

World Collapse!
Glitch Obby

The world is crumbling behind you , you have 30 seconds to run! Build a full Roblox obstacle course with collapsing platforms, coins, relics, enemies, trampolines and a time-freeze power-up. Stop the collapse at the end!

๐Ÿ‘ถ Ages 7+ โฑ๏ธ ~1.5-2 Hours ๐ŸŸฆ Roblox Studio โœ“ Free
๐Ÿงฑ 3 Worlds โฑ๏ธ 30s Timer ๐Ÿ’ฅ Collapse Wall ๐Ÿช™ Coins & Relics ๐Ÿ‘พ Enemies ๐Ÿš€ Trampolines โ„๏ธ Time Freeze ๐Ÿ† Leaderboard
โญ
0 XP
Level 1
๐Ÿ”ฅ0
Your Progress 0 / 10 steps
๐Ÿ› ๏ธ
Make it in our Roblox Studio too: lay out your level on a grid, add real Lua scripts and download a .rbxm model you can insert straight into Roblox Studio, right in the browser with no install. Open the Roblox Mod Studio →
๐Ÿ”ง
Stuck?
โ€ข Script does not run โ†’ Script must be INSIDE its Part/Model in Explorer
โ€ข Platform falls down โ†’ Check Anchored = true in Properties
โ€ข Wall doesn't move โ†’ Make sure Wall is Anchored and Script is in ServerScriptService, not inside a Part
1
๐Ÿ—บ๏ธ
Your Glitch World Plan
Understand the 30-second collapse and set up your Roblox Studio project
Active
๐ŸŽฏ
Goal for this step

Open Roblox Studio and understand how the "world crumbles behind you" mechanic works before we build it.

๐Ÿ‘จโ€๐Ÿ‘ง
Parent note: This builds on the free "Don't Fall! Obby" workshop. If this is your very first time in Studio, do that one first , it teaches Parts, Explorer and Properties. This episode adds timers, TweenService and CollectionService.

The big idea , 30 seconds to survive

  • 1Open Roblox Studio โ†’ Baseplate. Delete the Baseplate and SpawnLocation (we'll add our own).
  • 2Look at your GDD: Win = reach checkpoint, Lose = fall into void, Twist = world crumbles as you play.
  • 3Our plan: A giant red Collapse Wall slowly moves forward. Platforms behind it fade and fall. You must stay ahead of it , exactly like your 30-second timer.
  • 4In Explorer, create the folders you'll need: Right-click Workspace โ†’ Insert Object โ†’ Folder. Name one Map, one Checkpoints, one Coins, one Enemies.
  • 5In ReplicatedStorage create a Folder called Remotes and a ModuleScript called Config. This will hold all our tuning numbers.
๐Ÿ’ก
Why Config? Instead of hunting through 10 scripts to change speed, we keep COLLAPSE_SPEED, COIN_VALUE etc in one place. Pro games do this too!
ModuleScript , Config (in ReplicatedStorage)
local Config = { COLLAPSE_SPEED = 16, -- studs/sec -> 480 studs / 30s = 16 COLLAPSE_DELAY = 3, -- grace time in Safe Zone TIME_FREEZE_DURATION = 4, COIN_VALUE = 1, } return Config
๐Ÿ“ฆ
Want the easy way? Grab all 10 scripts as copy-paste files: โฌ‡ Download ZIP or browse individual .lua files โ†’. Each code block also has a Copy button.
๐Ÿ“Fill in the Concept+15 XP
The twist in this game is the world behind you. The player only has seconds before the catches them.
๐Ÿง 
Knowledge Check
+15 XP
What is the main mechanic that makes this obby different from a normal obby?
APlayers can fly
BYou collect pets
CThe world collapses behind you after ~30 seconds
2
๐Ÿ—๏ธ
Build 3 Worlds
Tutorial/Safe Zone โ†’ First Challenge โ†’ Boss Level, with checkpoints
Locked
๐ŸŽฏ
Goal for this step

Build a long straight course divided into 3 clear sections, with a Checkpoint part at the end of each.

Create the course

  • 1In Workspace > Map build a Safe Zone: a 20ร—1ร—20 platform, BrickColor Bright blue, with a SpawnLocation on it. This is World 1 , the collapse is paused here.
  • 2From there, build a straight path forward (along the Z axis) of ~12 platforms: Size 6, 1, 6 to 8, 1, 8, spaced 6-8 studs apart, zig-zag for fun. Use Cartoon colours: dark grey + neon glitch accents (Bright green / Magenta).
  • 3Mark the sections: Platforms 1-4 = World 1 (Tutorial), 5-9 = World 2 (First Challenge), 10-12+ = World 3 (Boss). Change platform Material to Slate for Boss for a tougher look.
  • 4Add Checkpoints: Create 4 Parts (size 4ร—0.5ร—4, Neon, Bright green, Anchored true, CanCollide false). Name them Checkpoint1 โ€ฆ Checkpoint4 and parent them to Checkpoints folder. Place them at the end of each World + Final win pad (12ร—1ร—12).
  • 5Add a huge lava/void Part below everything (200ร—1ร—600, Bright red, Neon, Y = -15) so falling = void.
๐Ÿ’ก
Tip for Ages 5-8: Keep early gaps small (5-6 studs). Save the big jumps for the Boss Level. Wider platforms (8 studs) are easier on mobile!
Script , CheckpointManager (ServerScriptService)
local Checkpoints = workspace:WaitForChild("Checkpoints") for _, cp in Checkpoints:GetChildren() do cp.Touched:Connect(function(hit) local player = game.Players:GetPlayerFromCharacter(hit.Parent) if player then local num = tonumber(cp.Name:match("%d+")) if num > (player:GetAttribute("Checkpoint") or 0) then player:SetAttribute("Checkpoint", num) player.RespawnLocation = cp -- respawn here next death end end end) end
๐Ÿ’ก
We store progress as an Attribute on the player. Attributes are visible in Explorer under the Player during Play , great for debugging!
โšกTrue or False?+15 XP
World 1 (Tutorial) should be safe with no collapse, so new players can learn.
Checkpoints should have CanCollide = true so players stand on them.
The void/lava floor below the course should kill players who fall.
๐Ÿง 
Knowledge Check
+15 XP
Why do we place Checkpoints in a Folder and read the number from the name like "Checkpoint3"?
ASo we can loop over them with one script instead of writing 4 scripts
BSo they look pretty in Explorer
CBecause Roblox requires folders for checkpoints
3
๐Ÿช™
Coins & Relics
Scatter collectibles along risky paths + count them on the leaderboard
Locked
๐ŸŽฏ
Goal for this step

Add 15 coins and 3 rare relics using CollectionService Tags , one script handles them all.

Add coins efficiently

  • 1Create a Part size 1.5, 1.5, 1.5, shape Ball (or Cylinder), BrickColor Bright yellow, Material Neon, Anchored true. Name it Coin. Add a PointLight inside so it glows.
  • 2In Explorer, find the Tag Editor (View โ†’ Tag Editor). Tag this part with Coin. Duplicate it 14 times along risky edges and hard jumps , reward risk!
  • 3Create 3 larger relic Parts (size 2,2,2, Diamond mesh, BrickColor Cyan). Tag them Relic. Hide them in secret spots.
  • 4In ServerScriptService create Script CollectSystem:
๐Ÿงฉ
Put the Steps in Order
+20 XP
Drag these Roblox Studio build steps into the correct order for this step of the workshop:
1Create a Part size 1.5, 1.5, 1.5, shape Ball (or Cylinder), BrickColor Bright yellow, Material Neon, Anchored true. Name it Coin. Add a PointLight inside so it glows.
2In Explorer, find the Tag Editor (View โ†’ Tag Editor). Tag this part with Coin. Duplicate it 14 times along risky edges and hard jumps , reward risk!
3Create 3 larger relic Parts (size 2,2,2, Diamond mesh, BrickColor Cyan). Tag them Relic. Hide them in secret spots.
4In ServerScriptService create Script CollectSystem:
Script , CollectSystem (ServerScriptService)
local CollectionService = game:GetService("CollectionService") local Players = game:GetService("Players") local function makeCollectable(tag, value) for _, obj in CollectionService:GetTagged(tag) do obj.Touched:Connect(function(hit) if obj:GetAttribute("Collected") then return end local player = Players:GetPlayerFromCharacter(hit.Parent) if not player then return end obj:SetAttribute("Collected", true) player.leaderstats.Coins.Value += value obj.Transparency = 1; obj.CanTouch = false task.wait(5) obj.Transparency = 0; obj.CanTouch = true; obj:SetAttribute("Collected", false) end) end end makeCollectable("Coin", 1) makeCollectable("Relic", 5)

Leaderstats

  • 5Add Script Leaderstats in ServerScriptService:
Script , Leaderstats
game.Players.PlayerAdded:Connect(function(plr) local ls = Instance.new("Folder"); ls.Name = "leaderstats"; ls.Parent = plr local c = Instance.new("IntValue"); c.Name = "Coins"; c.Value = 0; c.Parent = ls local t = Instance.new("NumberValue"); t.Name = "BestTime"; t.Value = 999; t.Parent = ls end)
๐Ÿ’ป
Code Challenge
+20 XP
Fill in the blanks to use CollectionService and prevent double-collection:
local CollectionService = game:GetService("") if obj:GetAttribute("Collected") then end obj:SetAttribute("Collected", true) player.leaderstats.Coins.Value +=
๐Ÿ’ก Hint: We fetch the "CollectionService" service, use return to exit early, and add 1 coin per pickup.
๐Ÿง 
Knowledge Check
+15 XP
Why use Tags / CollectionService instead of putting a Script in every coin?
AOne script for all coins is faster and easier to edit
BCoins only work with tags
CTags make coins spin
4
๐Ÿ’ฅ
The 30-Second Collapse Wall
The key feature: a moving wall of doom that chases the player
Locked
๐ŸŽฏ
Goal for this step

Build a giant wall that starts behind the Safe Zone and moves forward. If it touches you, you respawn.

๐Ÿ‘จโ€๐Ÿ‘ง
Parent note: This is the heart of your GDD's "world crumbles" idea. The wall is invisible gameplay logic + a big visual (glitch particles + screen shake). We keep it Anchored and move it with a Script , no physics lag.

Build the wall

  • 1In Workspace > Map insert a Part. Size 60, 30, 2, BrickColor Really red, Material Neon, Transparency 0.6, Anchored = true, CanCollide = false. Name it CollapseWall. Place it just behind the Safe Zone (e.g. Z = -25).
  • 2Inside it, Insert Object โ†’ ParticleEmitter (Rate 80, Lifetime 1-2, Speed 5, Color red/black) and a PointLight (Color red, Range 20, Brightness 2). Instant apocalypse vibes!
  • 3In ServerScriptService create Script CollapseController:
Script , CollapseController (ServerScriptService)
local Config = require(game.ReplicatedStorage:WaitForChild("Config")) local wall = workspace.Map:WaitForChild("CollapseWall") local RunService = game:GetService("RunService") local running = false local startPos = wall.Position -- Start collapse when any player leaves Safe Zone (touches Checkpoint1) workspace.Checkpoints.Checkpoint1.Touched:Connect(function(hit) if running then return end if game.Players:GetPlayerFromCharacter(hit.Parent) then running = true game.ReplicatedStorage.Remotes.CollapseWarning:FireAllClients(true) end end) RunService.Heartbeat:Connect(function(dt) if not running then return end wall.Position += Vector3.new(0, 0, Config.COLLAPSE_SPEED * dt) -- Kill anyone it touches (handled below too) end) wall.Touched:Connect(function(hit) local player = game.Players:GetPlayerFromCharacter(hit.Parent) if player and player.Character then local hum = hit.Parent:FindFirstChildWhichIsA("Humanoid") if hum then hum.Health = 0 end end end)
  • 4In ReplicatedStorage > Remotes add a RemoteEvent called CollapseWarning (for screen shake/client VFX).
  • 5Math check: Measure your course length (e.g. 480 studs). SPEED = LENGTH / 30. Set that in Config. Test: wall should take ~30s to reach the finish.
๐ŸŽฎ
Too hard for 5-8? Set COLLAPSE_SPEED = 11 (~45s) for Easy Mode, or 18 for Hardcore.
๐Ÿ’ป
Code Challenge
+20 XP
Fill in the blanks to move the wall every frame:
RunService.:Connect(function(dt) wall.Position += Vector3.new(0, 0, Config. * dt) end)
๐Ÿ’ก Heartbeat fires every frame. COLLAPSE_SPEED comes from Config.
๐Ÿ”ฎPredict What Happens+15 XP
You forget to set Anchored = true on the CollapseWall. What happens when you press Play?
AIt moves normally
BIt falls due to gravity
CIt turns invisible
๐Ÿง 
Knowledge Check
+15 XP
The wall moves with wall.Position += Vector3.new(0,0, speed * dt). What is dt?
AThe time since last frame , so movement is smooth even if FPS changes
BThe wall's colour
CThe player's health
5
๐Ÿงฉ
Make Platforms Crumble
Platforms fade and fall after the wall passes , pure glitch horror!
Locked
๐ŸŽฏ
Goal for this step

When the wall gets close, platforms behind it Tween to transparent then drop into the void.

  • 1Tag every course platform (except Safe Zone) with tag Crumble via Tag Editor.
  • 2In ServerScriptService create Script CrumbleController:
Script , CrumbleController
local CollectionService = game:GetService("CollectionService") local TweenService = game:GetService("TweenService") local wall = workspace.Map.CollapseWall local tweenInfo = TweenInfo.new(0.8, Enum.EasingStyle.Quad, Enum.EasingDirection.In) for _, plat in CollectionService:GetTagged("Crumble") do plat:SetAttribute("Crumbled", false) end game:GetService("RunService").Heartbeat:Connect(function() for _, plat in CollectionService:GetTagged("Crumble") do if plat:GetAttribute("Crumbled") then continue end -- if wall has passed this platform (wall Z > platform Z + 4) if wall.Position.Z > plat.Position.Z + 4 then plat:SetAttribute("Crumbled", true) local tw = TweenService:Create(plat, tweenInfo, {Transparency = 1}) tw:Play() tw.Completed:Wait() plat.CanCollide = false plat.Anchored = false -- now it falls! end end end)
๐Ÿ’ก
Why Tween then un-anchor? TweenService fades it nicely over 0.8s (glitch feel). Only then we let physics drop it , so it doesn't snap instantly.
  • 3Test: Play, sprint ahead. Look behind , platforms should vanish as the red wall eats them!
๐Ÿ“Fill in the Concept+15 XP
We use to fade the platform's to 1, then set CanCollide = false so players fall through.
๐Ÿง 
Knowledge Check
+15 XP
Why do we check wall.Position.Z > plat.Position.Z + 4 before crumbling?
ATo make sure the wall has actually passed that platform, so it crumbles *behind* you, not under you
BTo make platforms float
CTo make the wall invisible
6
๐Ÿ‘พ
Enemies & Obstacles
Spinners and patrollers , the "few different types" from your GDD
Locked
๐ŸŽฏ
Goal for this step

Add 2 simple enemy types that kill on touch. No complex AI needed.

Spinner (World 2)

  • 1Create Part size 8, 1, 1, Bright red, Anchored true, CanCollide false, Material Neon. Name Spinner. Add a Script inside:
Script (inside Spinner)
local spinner = script.Parent game:GetService("RunService").Heartbeat:Connect(function(dt) spinner.CFrame *= CFrame.Angles(0, math.rad(180) * dt, 0) end) spinner.Touched:Connect(function(hit) local hum = hit.Parent:FindFirstChildWhichIsA("Humanoid") if hum then hum.Health = 0 end end)

Patroller (Boss Level)

  • 2Create Part size 4, 4, 4, Bright orange, Anchored true. Name Patroller. Add Script:
Script (inside Patroller)
local plat = script.Parent local TweenService = game:GetService("TweenService") local startPos = plat.Position local endPos = startPos + Vector3.new(12, 0, 0) local info = TweenInfo.new(1.5, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut, -1, true) TweenService:Create(plat, info, {Position = endPos}):Play() plat.Touched:Connect(function(hit) local hum = hit.Parent:FindFirstChildWhichIsA("Humanoid") if hum then hum.Health = 0 end end)
๐ŸŽจ
Villain lore: These are the "bad guy's minions" from your Characters page! Make the Boss Level patroller look glitchy , add a second transparent part inside it.
โšกTrue or False?+15 XP
A Spinner uses CFrame.Angles every Heartbeat to rotate.
Patroller platforms must be Anchored for TweenService to work.
Enemies should have CanCollide = true so you stand on them safely.
๐Ÿง 
Knowledge Check
+15 XP
What's the difference between a Spinner and a Patroller?
ASpinner rotates in place, Patroller moves between two points
BSpinner moves, Patroller rotates
CThey are the same
7
๐Ÿš€
Power-Ups: Boost, Trampoline & Pause Time
From your GDD: coins, boosts, trampolines, pause time
Locked
๐ŸŽฏ
Goal for this step

Add 3 power-ups that help the player escape , especially the "pause time" freeze!

1. Boost Pad (speed burst)

  • 1Part 6ร—1ร—6, Bright yellow, Neon. Name BoostPad. Script:
Script (inside BoostPad)
script.Parent.Touched:Connect(function(hit) local hum = hit.Parent:FindFirstChildWhichIsA("Humanoid") if hum and not hit.Parent:GetAttribute("Boosted") then hit.Parent:SetAttribute("Boosted", true) hum.WalkSpeed = 32 task.wait(3) hum.WalkSpeed = 16 hit.Parent:SetAttribute("Boosted", false) end end)

2. Trampoline (super jump)

  • 2Part 6ร—1ร—6, Cyan, Neon. Name Trampoline. Script:
Script (inside Trampoline)
script.Parent.Touched:Connect(function(hit) local root = hit.Parent:FindFirstChild("HumanoidRootPart") local hum = hit.Parent:FindFirstChildWhichIsA("Humanoid") if root and hum then root.Velocity = Vector3.new(0, 90, 0) -- hero "jumps really high" end end)

3. Pause Time (freeze the wall!)

  • 3Part 2ร—2ร—2, shape Ball, Institutional white, Neon + PointLight. Name PausePickup, Tag it PausePickup. Place 2 in tricky spots. Add Script in ServerScriptService:
Script , PauseController (ServerScriptService)
local CS = game:GetService("CollectionService") local Config = require(game.ReplicatedStorage.Config) local originalSpeed = Config.COLLAPSE_SPEED for _, pickup in CS:GetTagged("PausePickup") do pickup.Touched:Connect(function(hit) if pickup:GetAttribute("Used") then return end local player = game.Players:GetPlayerFromCharacter(hit.Parent) if not player then return end pickup:SetAttribute("Used", true) pickup.Transparency = 1; pickup.CanTouch = false Config.COLLAPSE_SPEED = 0 -- freeze! game.ReplicatedStorage.Remotes.CollapseWarning:FireAllClients(false) -- tell UI "FROZEN" task.wait(Config.TIME_FREEZE_DURATION) Config.COLLAPSE_SPEED = originalSpeed game.ReplicatedStorage.Remotes.CollapseWarning:FireAllClients(true) task.wait(10) pickup.Transparency = 0; pickup.CanTouch = true; pickup:SetAttribute("Used", false) end) end
โ„๏ธ
Design tip: Put the Pause pickup just before a hard Spinner section , players will feel clever for saving it!
๐Ÿ’ป
Code Challenge
+20 XP
Fill in the blanks to give a speed boost:
hum.WalkSpeed = task.wait(3) hum.WalkSpeed =
๐Ÿ’ก Default WalkSpeed is 16, boosted is 32.
๐Ÿง 
Knowledge Check
+15 XP
How does the Pause Time pickup help the player?
AIt freezes the CollapseWall by setting COLLAPSE_SPEED to 0 for 4 seconds
BIt teleports to the finish
CIt makes you invincible forever
8
โฑ๏ธ
Timer UI & Glitch Effects
Show the 30s countdown and make the screen shake when the wall is near
Locked
๐ŸŽฏ
Goal for this step

Add an on-screen timer bar + screen shake so the "Tense" mood hits hard.

Build the UI

  • 1In StarterGui create ScreenGui named CollapseGui. Inside it add a TextLabel named TimerLabel at top centre (Position {0.5,0},{0.05,0}, AnchorPoint 0.5,0, Size {0.3,0},{0.07,0}, Text "โฑ๏ธ 30.0", Font GothamBold, TextScaled true, BackgroundTransparency 1, TextColor white). Add a Frame named Bar below it (Size {0.4,0},{0.02,0}, colour red) with a child Frame Fill that shrinks.
  • 2Inside CollapseGui add LocalScript named ClientEffects:
LocalScript , ClientEffects (inside CollapseGui)
local player = game.Players.LocalPlayer local label = script.Parent:WaitForChild("TimerLabel") local bar = script.Parent:WaitForChild("Bar"):WaitForChild("Fill") local Config = require(game.ReplicatedStorage:WaitForChild("Config")) local wall = workspace:WaitForChild("Map"):WaitForChild("CollapseWall") local totalDist = 480 -- your course length, change to match! local frozen = false game.ReplicatedStorage.Remotes.CollapseWarning.OnClientEvent:Connect(function(isRunning) frozen = not isRunning end) game:GetService("RunService").RenderStepped:Connect(function() local char = player.Character if not char or frozen then return end local root = char:FindFirstChild("HumanoidRootPart") if not root then return end local dist = wall.Position.Z - root.Position.Z -- distance to doom local pct = math.clamp(dist / totalDist, 0, 1) bar.Size = UDim2.new(pct, 0, 1, 0) local timeLeft = pct * 30 label.Text = frozen and "โ„๏ธ FROZEN!" or ("โฑ๏ธ " .. string.format("%.1f", timeLeft)) label.TextColor3 = timeLeft < 10 and Color3.fromRGB(255,50,50) or Color3.fromRGB(255,255,255) -- Screen shake when close if dist < 40 then workspace.CurrentCamera.CFrame *= CFrame.new(math.random(-1,1)*0.15, math.random(-1,1)*0.15, 0) end end)
๐Ÿ’ก
We calculate timeLeft = distance / speed. Shorter distance = less time = bar turns red + camera shakes. That's the "Tense" mood from your GDD!
๐Ÿ”ขOrder the Steps+15 XP
Put the Timer UI setup in order:
Create a ScreenGui in StarterGui
Add a TextLabel for the timer text
Add a Frame bar that shrinks as wall approaches
Add LocalScript to update every frame with RenderStepped
๐Ÿง 
Knowledge Check
+15 XP
Why does this UI Script use LocalScript + RenderStepped instead of a normal Script?
ABecause UI and camera shake only run on the player's device, not the server
BBecause LocalScripts are faster than Scripts
CBecause StarterGui only allows LocalScripts
9
๐Ÿ†
Win, Lose & Leaderboard
Get to the checkpoint = win, fall = void, leaderboard shows best times
Locked
๐ŸŽฏ
Goal for this step

Make the final pad stop the collapse and save the player's best time with a DataStore.

Win pad

  • 1Select Checkpoint4 (the final 12ร—12 pad). Set its BrickColor to Lime green + add a big Part flag above it. This is the "stop the world destroying itself" point.
  • 2Add Script inside it:
Script (inside Final Checkpoint)
local finish = script.Parent local Config = require(game.ReplicatedStorage.Config) local DataStoreService = game:GetService("DataStoreService") local store = DataStoreService:GetOrderedDataStore("BestTimes") local finished = {} finish.Touched:Connect(function(hit) local player = game.Players:GetPlayerFromCharacter(hit.Parent) if not player or finished[player.Name] then return end finished[player.Name] = true Config.COLLAPSE_SPEED = 0 -- STOP the collapse! local timeTaken = tick() - (player:GetAttribute("StartTime") or tick()) if timeTaken < player.leaderstats.BestTime.Value then player.leaderstats.BestTime.Value = math.floor(timeTaken*10)/10 pcall(function() store:SetAsync(tostring(player.UserId), math.floor(timeTaken*10)) end) end print(player.Name .. " WON in " .. timeTaken .. "s! ๐ŸŒŸ") end)
  • 3In your CollapseController, at the moment running = true, also do: player:SetAttribute("StartTime", tick()) so we can measure time properly per player.
  • 4For the lobby leaderboard: Add a Part with SurfaceGui + TextLabel. Add a Script that does store:GetSortedAsync(false, 10) to show top 10 times.
  • 5Make sure Enable Studio Access to API Services is ON in Game Settings โ†’ Security (needed for DataStores to save).
โš ๏ธ
DataStores don't save in Studio unless API Services is enabled. Test with Publish or enable it before pressing Play.
๐Ÿ“Fill in the Concept+15 XP
Reaching the final checkpoint sets COLLAPSE_SPEED to to stop the wall. We save the fastest time with an so the leaderboard is sorted.
๐Ÿง 
Knowledge Check
+15 XP
What happens the moment a player touches the final win pad?
AThe collapse stops, their time is saved if it's their best, and they win
BThe whole map resets
CNothing, the timer keeps going
10
๐ŸŽจ
Polish, Sound & Publish!
Make it feel tense, glitchy and epic , then share it
Locked
๐ŸŽฏ
Goal for this step

Final polish: lighting, sound, cartoon art pass, test and publish so friends can play on any device.

1. Art & Atmosphere (Cartoon + Glitch)

  • 1Set Lighting โ†’ FogColor (dark grey), FogEnd 600, Brightness 2, EnvironmentScale 1. For the Boss area add a ColorCorrectionEffect (Tint red) and increase wall PointLight Range to 40.
  • 2Add MaterialVariant or Decals for glitch cracks on Boss platforms. Keep palette to 5 colours max: Dark Stone Grey, Black, Neon Green, Magenta, Cyan.
  • 3Set your hero's JumpPower to 55 (StarterPlayer โ†’ CharacterJumpPower) so they "jump really high" as per Characters sheet.

2. Sound & Music (Mysterious + Rock, Tense)

  • 4In SoundService add 2 Sounds: Mysterious Loop for World 1-2, Rock Tense Loop for when timer <10s. Insert from Toolbox (search "mysterious ambient", "rock tense"). Set Looped true, RollOffMode Linear.
  • 5Add SFX Parts: coin ding (when collected), crunch (enemy hit), boing (trampoline), freeze whoosh (pause pickup), victory fanfare (final pad). Use Sound:Play() in each Touched script.

3. Test & Publish

  • 6Press Play and run the full course. Check: Can you win in 30s? If not, tune Config. Try on Emulator โ†’ Phone (View tab โ†’ Device Emulator) , all jumps must be possible with touch.
  • 7File โ†’ Save to Roblox. Then File โ†’ Publish to Roblox โ†’ Name "World Collapse Obby by [YourName]" โ†’ Privacy Public โ†’ Create.
  • 8Copy the game link from roblox.com and share it! Use GDD Builder to export your finished design as PDF for your portfolio.
๐ŸŽ‰
You built a full tense glitch obby with a 30-second doom wall! Now tweak it: try a 15-second hardcore mode, add a double-jump, or make a co-op door where 2 players must arrive together.
๐Ÿ”ขOrder the Steps+15 XP
Put the final publish in order:
Test with Device Emulator (Phone)
File โ†’ Save to Roblox
File โ†’ Publish to Roblox (Public)
Share the link with friends!
โšกTrue or False?+15 XP
Setting JumpPower to 55 makes the hero jump really high as described in Characters.
You should test on Phone emulator because the game is All Platforms.
Publishing requires paying Robux.
๐Ÿง 
Final Knowledge Check
+15 XP
Your GDD mood is Tense. Which two details best sell that?
ADaytime lighting and circus music
BShrinking timer bar + screen shake when wall is close + red glitch lighting & rock music at the end
CRemoving all enemies
๐ŸŽ“
What you just learned:
  • How to build a multi-world course: Tutorial โ†’ Challenge โ†’ Boss with checkpoints and respawns
  • CollectionService Tags for coins/relics (one script, many pickups) + leaderstats
  • The collapse system: Anchored wall moved by Heartbeat + dt, TweenService crumble, CollectionService
  • Two enemy types: spinning CFrame + Tween patroller, both with Touched kill logic
  • Power-ups: WalkSpeed boost, Velocity trampoline, Config.SPEED freeze (pause time)
  • Client UI: LocalScript + RenderStepped timer bar, screen shake, RemoteEvents, OrderedDataStore leaderboard
  • Polishing for Ages 5-8, All Platforms: jump tuning, lighting, sound, mobile testing and publishing
๐Ÿ’ฅ๐Ÿƒ๐Ÿ’จ๐Ÿ†๐ŸŒ
You Stopped the Collapse!

Legendary! You built a full 30-second glitch obby , 3 worlds, collapsing platforms, enemies, power-ups and a best-time leaderboard. The world is saved. Now go make it harder!

0
Total XP
1
Level
0
Best Streak
0%
Accuracy
๐ŸŸฆ Back to All Episodes โ†’ โญ View My Progress & Certificates

This workshop was free and took many hours to build. If it helped you learn something new, consider supporting the project.

☕ Support on Ko-fi