๐ŸŒ Roblox Neon Obby ยท Glitch World ยท Self-Destructing Platforms ยท See All Episodes
๐ŸŒ Intermediate ยท Tense ยท Neon Simulation ยท Glitch Effects

CORRUPTED
The Neon Glitch Obby

The simulation is breaking. The world deletes itself behind you as you run. A wall of pure Corruption chases you through three neon zones. Touch it and your screen glitches. Escape before the whole world unravels!

๐Ÿง‘ Ages 10+ โฑ๏ธ ~2 Hours ๐ŸŸฆ Roblox Studio โœ“ Free
๐ŸŒ 3 Neon Zones ๐Ÿ’€ Self-Destruct โ˜ ๏ธ Corruption Zone ๐Ÿ”ท Data Shards โšก Glitch Screen ๐Ÿ”„ Spinners โฑ๏ธ Speed Timer ๐Ÿ† Leaderboard
โญ
0 XP
Level 1
๐Ÿ”ฅ0
Your Progress 0 / 8 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 →
๐Ÿ“ฆ
Workshop reference pack: download an offline copy of every step in this workshop: โฌ‡ roblox-corruption-obby-workshop-reference.zip. Every code block also has a Copy button.
๐Ÿ”ง
Stuck?
โ€ข Script won't run โ†’ Check it is INSIDE the right location in Explorer (Server scripts go in ServerScriptService; Local scripts go in StarterPlayerScripts or StarterGui)
โ€ข Platforms don't fall โ†’ Make sure they are tagged "Destroyable" in the Tag Editor and the script is running
โ€ข Corruption Zone won't move โ†’ Confirm the Part is named exactly CorruptionZone and is Anchored
1
๐ŸŒ
The Failing Simulation
Understand the mechanic, set up Roblox Studio and write your Config module
Active
๐ŸŽฏ
Goal for this step

Open Roblox Studio, understand how the "world deletes itself behind you" mechanic works, and write a Config module that controls all game numbers in one place.

๐Ÿ‘จโ€๐Ÿ‘ง
Parent note: This workshop builds on the free "Don't Fall! Obby" and "World Collapse!" workshops. If this is your first time in Roblox Studio, complete those first. This episode adds TweenService, CollectionService, RemoteEvents and LocalScripts.

The big idea: a world that erases itself

  • 1Open Roblox Studio โ†’ Baseplate. Delete the Baseplate (we'll replace it). Keep SpawnLocation for now.
  • 2The twist: platforms are tagged "Destroyable". A script watches the player's position. The moment a platform is far enough behind you, it fades and vanishes. The world literally cannot exist without you.
  • 3On top of that, a huge Corruption Zone wall slides forward. If it catches you, a glitch-screen effect plays and you respawn.
  • 4In Explorer, create these folders under Workspace: Map, Checkpoints, Shards, Hazards. In ReplicatedStorage create a Folder called Remotes and a ModuleScript called Config.
  • 5Inside the Config ModuleScript, type the code below. This is the one place you'll tune every number in the game.
ModuleScript: Config (in ReplicatedStorage)
local Config = { CORRUPTION_SPEED = 12, -- studs/sec the wall moves forward CORRUPTION_DELAY = 5, -- grace seconds before the wall starts PLATFORM_SAFE_DIST = 28, -- studs behind player before platform fades PLATFORM_FADE_TIME = 1.2, -- seconds for the fade + shrink animation SHARD_VALUE = 1, -- points per Data Shard CORE_SHARD_VALUE = 5, -- points per rare Core Shard CORRUPT_WARN_DIST = 18, -- studs: distance at which the warning flashes } return Config
๐Ÿ’ก
Why a Config? Instead of hunting through 6 scripts to change speed, you edit one number here. Every script reads Config.CORRUPTION_SPEED. Change it once; everything updates!
๐Ÿ“Fill in the Concept+15 XP
In this game the world itself behind you. A wall called the chases the player. Every number is controlled from one module.
๐Ÿง 
Knowledge Check
+15 XP
Why do we put CORRUPTION_SPEED in a Config ModuleScript rather than directly inside each script?
ABecause Roblox requires it
BTo make the script longer
CSo we can change one number and every script that reads it updates automatically
2
๐Ÿ—๏ธ
Build the Neon World
Three zones: Boot Sequence, Memory Lane and Kernel Panic
Locked
๐ŸŽฏ
Goal for this step

Build a course of neon platforms running along the Z axis divided into 3 zones, with a Checkpoint at the end of each.

Neon colour palette

  • 1Select Workspace โ†’ Baseplate and delete it. Add a giant void floor: Part, Size 300, 1, 800, Y = -20, BrickColor Really black, Material SmoothPlastic, Anchored true. This is the void below the course.
  • 2Use this neon palette for your platforms: Zone 1 (Boot Sequence) = Cyan / Bright blue / Medium blue. Zone 2 (Memory Lane) = Magenta / Hot pink / Bright violet. Zone 3 (Kernel Panic) = Bright red / Neon orange / Hot pink. All platforms: Material = Neon, Anchored = true.
  • 3Build about 18-22 platforms running in the +Z direction. Zone 1 (platforms 1-7): size 8ร—1ร—8, gaps 6-8 studs, close together. Zone 2 (platforms 8-14): size 6ร—1ร—6, gaps 8-10 studs. Zone 3 (platforms 15-22): size 5ร—1ร—5, gaps 10-12 studs, with sharp turns. Parent all to the Map folder.
  • 4Add a PointLight inside each platform (Insert Object โ†’ PointLight). Set Brightness to 2 and Range to 16. Change the light colour to match the platform. This makes the world glow in the dark.
  • 5Add a SpawnLocation at the start (size 8ร—1ร—8, Neon, Bright blue). Add 4 Checkpoint Parts (size 4ร—0.5ร—4, Neon, Lime green, Anchored true, CanCollide false, Transparency 0.5). Name them Checkpoint1 through Checkpoint4. Parent them to the Checkpoints folder. Place the last one at the end of Zone 3 as the win pad.
  • 6Add this CheckpointManager script in ServerScriptService:
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 not player then return end local num = tonumber(cp.Name:match("%d+")) if num > (player:GetAttribute("Checkpoint") or 0) then player:SetAttribute("Checkpoint", num) player.RespawnLocation = cp end end) end
๐Ÿ’ก
Add a SelectionBox to each Checkpoint to make it glow with an outline. In Explorer, insert SelectionBox inside a Checkpoint and set Adornee to the Checkpoint part. Set LineThickness to 0.06 and Color3 to bright cyan.
โšกTrue or False?+15 XP
Platforms should have Anchored = true so they stay in place until our script moves them.
Checkpoints should have CanCollide = true so the player can stand on them.
Using Material Neon makes the platform glow even without a PointLight inside it.
๐Ÿง 
Knowledge Check
+15 XP
Why do we build the course running along the +Z axis?
ASo our script can compare the player's Z position to each platform's Z position to know what is "behind" them
BBecause Roblox only works along Z
CTo make it look cool
3
๐Ÿ”ท
Data Shards
Scatter glowing collectibles using CollectionService tags
Locked
๐ŸŽฏ
Goal for this step

Add 15 Data Shards and 3 rare Core Shards using CollectionService Tags so one script handles all of them.

Create a Data Shard

  • 1Create a Part: Size 1.5, 1.5, 1.5, Shape Ball, BrickColor Cyan, Material Neon, Anchored true. Name it Shard. Add a PointLight inside (Brightness 3, Range 12, Color cyan).
  • 2Go to View โ†’ Tag Editor. Select your Shard part and click + to add a tag: type Shard and press Enter. Duplicate the Shard 14 times and scatter along risky jump edges. Parent all to the Shards folder.
  • 3Create 3 larger rare shards: Size 2, 2, 2, BrickColor Hot pink, Material Neon, Anchored true. Name each CoreShard. Tag them CoreShard in the Tag Editor. Hide them in tricky secret spots.
  • 4In ServerScriptService create a Script called LeaderStats:
๐Ÿงฉ
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, BrickColor Cyan, Material Neon, Anchored true. Name it Shard. Add a PointLight inside (Brightness 3, Range 12, Color cyan).
2Go to View โ†’ Tag Editor. Select your Shard part and click + to add a tag: type Shard and press Enter. Duplicate the Shard 14 times and scatter along risky jump edges. Parent all to the Shards folder.
3Create 3 larger rare shards: Size 2, 2, 2, BrickColor Hot pink, Material Neon, Anchored true. Name each CoreShard. Tag them CoreShard in the Tag Editor. Hide them in tricky secret spots.
4In ServerScriptService create a Script called LeaderStats:
Script: LeaderStats (ServerScriptService)
game.Players.PlayerAdded:Connect(function(plr) local ls = Instance.new("Folder") ls.Name = "leaderstats" ls.Parent = plr local shards = Instance.new("IntValue") shards.Name = "Shards" shards.Value = 0 shards.Parent = ls local best = Instance.new("NumberValue") best.Name = "BestTime" best.Value = 0 best.Parent = ls end)
  • 5Create a Script called CollectSystem in ServerScriptService:
Script: CollectSystem (ServerScriptService)
local CollectionService = game:GetService("CollectionService") local Players = game:GetService("Players") local TweenService = game:GetService("TweenService") local Config = require(game.ReplicatedStorage:WaitForChild("Config")) local function setupCollectable(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.Shards.Value += value -- Spin and shrink away TweenService:Create(obj, TweenInfo.new(0.4), { Size = Vector3.new(0.1, 0.1, 0.1), Transparency = 1 }):Play() task.wait(8) -- respawn after 8 seconds obj.Size = Vector3.new(1.5, 1.5, 1.5) obj.Transparency = 0 obj:SetAttribute("Collected", false) end) end end setupCollectable("Shard", Config.SHARD_VALUE) setupCollectable("CoreShard", Config.CORE_SHARD_VALUE)
๐Ÿ’ป
Code Challenge
+20 XP
Fill in the blanks so duplicate-collection is blocked and the player earns their points:
local CollectionService = game:GetService("") if obj:GetAttribute("Collected") then end obj:SetAttribute("Collected", true) player.leaderstats.Shards.Value +=
๐Ÿ’ก Hint: the service is CollectionService, early exit is "return", and we add the function's "value" parameter to Shards.
๐Ÿง 
Knowledge Check
+15 XP
Why do we use CollectionService Tags instead of adding a Script inside every shard?
AOne script loops over all tagged objects. Add 50 more shards and nothing changes in the script
BTags make the shards glow brighter
CRoblox won't allow scripts inside parts
4
๐Ÿ’€
Self-Destructing Platforms
The world deletes itself behind you as you run
Locked
๐ŸŽฏ
Goal for this step

Tag every platform as "Destroyable". A script watches where the player is and fades out any platform that is far enough behind them.

Tag every platform

  • 1Open View โ†’ Tag Editor. Select all your platforms in the Map folder (click one, Ctrl+A to select all in the folder, or hold Ctrl and click each). With all selected, click + in the Tag Editor and type Destroyable, then Enter. Every platform now has the tag.
  • 2Do NOT tag Checkpoints, the SpawnLocation or the void floor. Those must stay.
  • 3In ServerScriptService create a Script called PlatformManager:
Script: PlatformManager (ServerScriptService)
local CollectionService = game:GetService("CollectionService") local TweenService = game:GetService("TweenService") local Players = game:GetService("Players") local Config = require(game.ReplicatedStorage:WaitForChild("Config")) local fading = {} -- keeps track of platforms already fading while true do task.wait(0.25) -- check 4 times per second for _, player in Players:GetPlayers() do local char = player.Character if not char then continue end local root = char:FindFirstChild("HumanoidRootPart") if not root then continue end local playerZ = root.Position.Z for _, platform in CollectionService:GetTagged("Destroyable") do if fading[platform] then continue end -- Is this platform far enough behind the player? if platform.Position.Z < (playerZ - Config.PLATFORM_SAFE_DIST) then fading[platform] = true -- Fade out and shrink local tween = TweenService:Create( platform, TweenInfo.new(Config.PLATFORM_FADE_TIME, Enum.EasingStyle.Quad), { Transparency = 1, Size = platform.Size * Vector3.new(1, 0.05, 1) } ) tween:Play() tween.Completed:Connect(function() platform:Destroy() end) end end end end
๐Ÿ’ก
How it works: Every 0.25 seconds the script checks every tagged platform. If a platform's Z position is more than PLATFORM_SAFE_DIST studs behind the player's Z position, it starts fading. The world literally can't survive without you being in it!
โš ๏ธ
Important: This script uses a Server Script so all players see platforms disappear at the same time. If you made it a LocalScript each player would see a different version of the world.
๐Ÿ“Fill in the Concept+15 XP
The PlatformManager loops over every part tagged . If a platform is far enough the player along the Z axis it starts to and then gets .
๐Ÿง 
Knowledge Check
+15 XP
What does the fading[platform] = true line do and why is it important?
AIt changes the platform's colour to a fading colour
BIt marks the platform so the loop skips it next time, stopping us from starting the fade animation twice
CIt deletes the platform immediately
5
โ˜ ๏ธ
The Corruption Zone
A wall of pure glitch that slides forward and kills on touch
Locked
๐ŸŽฏ
Goal for this step

Build the Corruption Zone wall, move it forward with TweenService, and kill any player it touches while triggering a glitch screen effect.

Build the wall

  • 1Insert a Part. Name it CorruptionZone (exact name, the script needs it). Size: 150, 60, 4. BrickColor: Hot pink or Magenta. Material: Neon. Transparency: 0.25. Anchored: true. CanCollide: false. CanTouch: true.
  • 2Place the wall behind the SpawnLocation (lower Z value). Centre it on the course (X = 0). Make it tall enough to cover the full height range.
  • 3Set up the RemoteEvent. In ReplicatedStorage โ†’ Remotes folder insert a RemoteEvent. Name it OnCorrupted. This lets the server tell a specific player's screen to glitch.
  • 4In ServerScriptService create a Script called CorruptionZone:
Script: CorruptionZone (ServerScriptService)
local TweenService = game:GetService("TweenService") local Players = game:GetService("Players") local Config = require(game.ReplicatedStorage:WaitForChild("Config")) local OnCorrupted = game.ReplicatedStorage.Remotes:WaitForChild("OnCorrupted") local zone = workspace:WaitForChild("CorruptionZone") -- Grace period: give the player time to learn the course task.wait(Config.CORRUPTION_DELAY) -- How far does the wall travel? Tune this to match your course length local TRAVEL_DISTANCE = 700 -- studs local duration = TRAVEL_DISTANCE / Config.CORRUPTION_SPEED TweenService:Create(zone, TweenInfo.new(duration, Enum.EasingStyle.Linear), { Position = zone.Position + Vector3.new(0, 0, TRAVEL_DISTANCE) } ):Play() -- Kill any player that touches the wall local cooldowns = {} zone.Touched:Connect(function(hit) local player = Players:GetPlayerFromCharacter(hit.Parent) if not player then return end if cooldowns[player] then return end -- no double-kill cooldowns[player] = true -- Tell the client to show the glitch screen, THEN kill OnCorrupted:FireClient(player) task.wait(0.7) local hum = hit.Parent:FindFirstChildOfClass("Humanoid") if hum then hum.Health = 0 end task.wait(3) cooldowns[player] = nil end)
๐Ÿ’ก
FireClient vs FireServer: The server calls OnCorrupted:FireClient(player) to send a signal to THAT player's screen only. The LocalScript (Step 7) listens with OnCorrupted.OnClientEvent:Connect(...) and shows the glitch effect. Server and Client talk via RemoteEvents!
โšกTrue or False?+15 XP
The Corruption Zone should have CanCollide = false so the player passes through it rather than being stopped by it.
FireClient sends a message from the server to one specific player's screen only.
We should kill the player the instant they touch the wall without any delay.
๐Ÿง 
Knowledge Check
+15 XP
What is the purpose of the cooldowns table in the Corruption Zone script?
ATo store the player's best time
BTo make the wall slow down
CTo prevent the same player being killed multiple times in a row before they can respawn
6
โšก
Corrupted Obstacles
Spinning neon blades and flickering unstable platforms
Locked
๐ŸŽฏ
Goal for this step

Add two obstacle types: Glitch Spinners that rotate and kill on touch, and Flicker Platforms that randomly drop their collision.

Glitch Spinners

  • 1Create a Part: Size 8, 0.5, 1, BrickColor Hot pink, Material Neon, Anchored true. Name it GlitchSpinner. Parent it to the Hazards folder. Position it floating above a platform gap in Zone 2 or 3.
  • 2Insert a Script directly inside the GlitchSpinner part (not in ServerScriptService). Use this code:
Script: inside GlitchSpinner part
local RunService = game:GetService("RunService") local Players = game:GetService("Players") local blade = script.Parent local SPEED = 120 -- degrees per second -- Spin the blade RunService.Heartbeat:Connect(function(dt) blade.CFrame = blade.CFrame * CFrame.Angles(0, math.rad(SPEED * dt), 0) end) -- Kill on touch blade.Touched:Connect(function(hit) local player = Players:GetPlayerFromCharacter(hit.Parent) if not player then return end local hum = hit.Parent:FindFirstChildOfClass("Humanoid") if hum then hum.Health = 0 end end)
  • 3Duplicate the GlitchSpinner 2-4 times and place in different spots. You can change SPEED inside each one for variety. Try 80, 120, and 160!

Flicker Platforms

  • 4Create a platform: Size 6, 1, 6, BrickColor Bright violet, Material Neon, Anchored true. Name it FlickerPlatform. Place a few in Zone 2 and Zone 3 over gaps.
  • 5Insert a Script inside the FlickerPlatform part:
Script: inside FlickerPlatform part
local platform = script.Parent while true do -- Safe: platform is solid task.wait(math.random(3, 6)) -- Warning flicker for i = 1, 5 do platform.Transparency = 0.7 task.wait(0.1) platform.Transparency = 0 task.wait(0.08) end -- GONE: platform turns off platform.CanCollide = false platform.Transparency = 0.9 task.wait(1.8) -- Back on platform.CanCollide = true platform.Transparency = 0 end
๐Ÿ’ก
Tip: put a SelectionBox inside FlickerPlatform and change its colour between the flicker states using selBox.Color3 = Color3.fromRGB(255,0,150) during the warning phase. It makes the danger visual super clear!
๐Ÿ’ป
Code Challenge
+20 XP
Fill in the blanks to make a FlickerPlatform go invisible and lose its collision:
platform. = false platform. = 0.9 task.wait(1.8) platform.CanCollide =
๐Ÿ’ก Hint: the two properties are CanCollide and Transparency. After the gap, CanCollide goes back to true.
๐Ÿง 
Knowledge Check
+15 XP
Why do we use RunService.Heartbeat to spin the blade instead of a simple while true do loop?
AHeartbeat fires every frame and gives us dt (delta time) so the spin speed stays consistent at any frame rate
Bwhile true loops are not allowed in Roblox
CHeartbeat makes the blade glow
7
๐Ÿ‘พ
The CORRUPTED Screen Effect
When the Corruption Zone catches you, your screen glitches
Locked
๐ŸŽฏ
Goal for this step

Create a LocalScript that listens for the OnCorrupted RemoteEvent and plays a glitch screen overlay with "โš  CORRUPTED โš " text that flickers before the player respawns.

๐Ÿ’ก
Server vs Client: The Corruption Zone script runs on the SERVER and handles the actual kill. This LocalScript runs on the CLIENT (the player's screen). They talk via the OnCorrupted RemoteEvent. The server fires it; the client's screen reacts.

Create the glitch screen

  • 1In Explorer go to StarterPlayer โ†’ StarterPlayerScripts. Insert a LocalScript. Name it CorruptionEffect. This runs on each player's own computer.
  • 2Type the code below into the LocalScript:
LocalScript: CorruptionEffect (StarterPlayerScripts)
local Players = game:GetService("Players") local player = Players.LocalPlayer local gui = player:WaitForChild("PlayerGui") local OnCorrupted = game.ReplicatedStorage.Remotes:WaitForChild("OnCorrupted") -- Build the overlay GUI once local screen = Instance.new("ScreenGui") screen.Name = "GlitchScreen" screen.ResetOnSpawn = false screen.Parent = gui local bg = Instance.new("Frame") bg.Size = UDim2.new(1, 0, 1, 0) bg.BackgroundColor3 = Color3.fromRGB(180, 0, 220) bg.BackgroundTransparency = 1 bg.Parent = screen local label = Instance.new("TextLabel") label.Size = UDim2.new(1, 0, 0.3, 0) label.Position = UDim2.new(0, 0, 0.35, 0) label.BackgroundTransparency = 1 label.Text = "โš  CORRUPTED โš " label.TextColor3 = Color3.fromRGB(255, 0, 180) label.TextScaled = true label.Font = Enum.Font.Code label.Visible = false label.Parent = bg -- React when the server fires OnCorrupted at this player OnCorrupted.OnClientEvent:Connect(function() label.Visible = true bg.BackgroundTransparency = 0.3 -- Flicker between pink and cyan 8 times for i = 1, 8 do if i % 2 == 0 then bg.BackgroundColor3 = Color3.fromRGB(180, 0, 220) label.TextColor3 = Color3.fromRGB(255, 20, 180) else bg.BackgroundColor3 = Color3.fromRGB(0, 200, 255) label.TextColor3 = Color3.fromRGB(255, 255, 255) end task.wait(0.09) end -- Fade out bg.BackgroundTransparency = 1 label.Visible = false end)
๐Ÿ’ก
Want scan lines? Add a second Frame inside bg with a semi-transparent dark colour and size 1ร—0.5 pixels, then duplicate it 20 times down the screen. It gives a real CRT glitch look!
๐Ÿ’ป
Code Challenge
+20 XP
Fill in the blanks to listen for the RemoteEvent on the client and show the label:
OnCorrupted.:Connect(function() label.Visible = true bg.BackgroundTransparency = 0.3 task.wait(0.7) label.Visible = end)
๐Ÿ’ก Hint: the event on a RemoteEvent that clients listen to is called OnClientEvent. After the effect ends, label.Visible becomes false.
๐Ÿง 
Knowledge Check
+15 XP
Why is the CorruptionEffect a LocalScript in StarterPlayerScripts and not a regular Script in ServerScriptService?
ALocalScripts are faster than Scripts
BWe want each player to see a glitch effect on their OWN screen only. LocalScripts run on the player's computer; regular Scripts run on the server for everyone
CScreenGui only works in LocalScripts
8
โฑ๏ธ
Speed Timer, Polish & Publish
Add a live timer HUD, tweak difficulty and publish your game
Locked
๐ŸŽฏ
Goal for this step

Add a ticking speed-run timer the player sees on screen, a proximity warning when the Corruption Zone is close, and publish the finished game.

Speed-run Timer (LocalScript)

  • 1In StarterGui insert a ScreenGui. Name it HUD. Inside it add a TextLabel. Name it TimerLabel. Position: AnchorPoint = 0.5,0 | Position = 0.5,0,0,12 | Size = 0.2,0,0.06,0. Font = Code. TextScaled = true. BackgroundTransparency = 0.5. BackgroundColor3 = black.
  • 2Inside StarterGui โ†’ HUD insert a LocalScript called TimerScript:
LocalScript: TimerScript (inside StarterGui/HUD)
local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Config = require(game.ReplicatedStorage:WaitForChild("Config")) local player = Players.LocalPlayer local timerLabel = script.Parent:WaitForChild("TimerLabel") local startTime = tick() local finished = false -- Count up every frame RunService.RenderStepped:Connect(function() if finished then return end local elapsed = tick() - startTime timerLabel.Text = string.format("โฑ %.1fs", elapsed) -- Check if Corruption Zone is getting close local char = player.Character local zone = workspace:FindFirstChild("CorruptionZone") if char and zone then local root = char:FindFirstChild("HumanoidRootPart") if root then local dist = root.Position.Z - zone.Position.Z if dist < Config.CORRUPT_WARN_DIST then timerLabel.TextColor3 = Color3.fromRGB(255, 50, 50) -- red = danger else timerLabel.TextColor3 = Color3.fromRGB(0, 255, 200) -- cyan = safe end end end end) -- Stop timer when player hits final checkpoint player:GetAttributeChangedSignal("Checkpoint"):Connect(function() if player:GetAttribute("Checkpoint") == 4 then -- 4 = final checkpoint finished = true local elapsed = tick() - startTime timerLabel.Text = string.format("โœ… %.1fs - Escaped!", elapsed) timerLabel.TextColor3 = Color3.fromRGB(50, 255, 100) end end)

Final Polish Checklist

  • 3Lighting: In Explorer โ†’ Lighting, set Ambient to 0, 0, 0 (pitch black), OutdoorAmbient to 0, 0, 0, Brightness to 0. The only light comes from your neon platforms. Eerie!
  • 4Atmosphere: Insert Atmosphere inside Lighting. Set Density to 0.35, Color to dark purple. This adds a foggy glow around the neon light.
  • 5Play test: Press F5 to play. Check that platforms near the start fade as you run forward. Check the Corruption Zone starts moving after the delay. Check shards collect. If the wall moves too fast, raise CORRUPTION_DELAY or lower CORRUPTION_SPEED in Config.
  • 6Publish: File โ†’ Publish to Roblox. Set Name, Description and Genre. Set Playable Devices to Computer and Phone. Set Access to Public. Share the link!
๐ŸŽฎ
Make it harder: Raise CORRUPTION_SPEED to 16+. Lower PLATFORM_SAFE_DIST to 20 so platforms disappear faster. Add more FlickerPlatforms in Zone 3. Or... make some Destroyable platforms already start fading slowly when the game begins!
โšกTrue or False?+15 XP
Setting Ambient = 0,0,0 and Brightness = 0 in Lighting makes the world completely dark, so only Neon parts glow.
You need to buy Robux to publish a Roblox game.
If the Corruption Zone moves too fast, you can reduce the difficulty by increasing CORRUPTION_DELAY in Config.
๐Ÿง 
Final Knowledge Check
+15 XP
Your timer goes red when the Corruption Zone is within CORRUPT_WARN_DIST studs. Which script is doing this and why?
AThe CorruptionZone server script, because only the server knows where the wall is
BThe TimerScript LocalScript, because it runs every frame on the player's screen and can compare the player's position to the wall's position directly
CThe LeaderStats script
๐ŸŽ“
What you just learned:
  • Config ModuleScript: one place to tune every number in your game
  • CollectionService Tags: one script handles all tagged objects (shards, platforms)
  • TweenService: smooth fade-and-shrink animations for platform destruction
  • RunService.Heartbeat with delta time: frame-rate-independent rotation for spinners
  • RemoteEvents: server fires OnCorrupted, LocalScript reacts on the player's screen only
  • LocalScript vs Script: client-side screen effects vs server-side game logic
  • RenderStepped timer with proximity colour change for tension
โšก๐ŸŒ๐Ÿ”ทโ˜ ๏ธ๐Ÿ†
You Escaped the Corruption!

Incredible! The simulation tried to swallow you whole but you outran it. You built a self-destructing neon world with a chasing Corruption Zone, glitch-death effects, spinning hazards and a live speed-run timer. Now go make it even 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