Roblox Studio - How To Create Checkpoints [Skip Stage feat. Remote Function]

Опубликовано: 17 Июль 2026
на канале: Kinfolk Studio
152
4

In this video, we are going to create a checkpoint system that has a GUI button for the player to skip stage. We also slightly touched the concept of remote functions between server and clients.

We are re-using some of the scripts we made in our pervious videos, and if you want to review them, here are the links:
How To Make Teleporters    • Roblox Studio - How To Make Teleporters [F...  
How To Handle Data #1    • Roblox Studio - How To Handle Data #1 [In-...  
How To Handle Data #2    • Roblox Studio - How To Handle Data #2 [Dat...  
How To Handle Data #3    • Roblox Studio - How To Handle Data #3 [Glo...  

Script under each Checkpoint part:
script.Parent.Touched:Connect(function(hit)
if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") then
local Player = game.Players:GetPlayerFromCharacter(hit.Parent)
if Player then
Player.SavedData.CurrentCheckPoint.Value = script.Parent.Name
end
end
end)

Local Script under SkipStage Button:
local Player = game.Players.LocalPlayer
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ClientToServerRemotes = ReplicatedStorage:WaitForChild("ClientToServerRemotes")

local function onSkipStage(Player)
local SkipResult = ClientToServerRemotes:WaitForChild("SkipStage"):InvokeServer(Player)
if SkipResult == false then
print("Skip failed")
else
print("Skip success")
end
end

script.Parent.Activated:Connect(onSkipStage)

Checkpoints Script in ServerScriptService:
local ServerScriptService = game:GetService("ServerScriptService")
local TeleportModule = require(ServerScriptService:WaitForChild("TeleportModule"))
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ClientToServerRemotes = ReplicatedStorage:WaitForChild("ClientToServerRemotes")
local Checkpoints = workspace:WaitForChild("Checkpoints")

local CheckpointsSequence = {
"CP001",
"CP002",
"CP003",
"CP004",
"CP005",
}

local function onSkipStage(Player)
if Player.SavedData.CurrentCheckPoint.Value == "" then
return false
end
local NewCheckPoint = ""
for i, v in ipairs(CheckpointsSequence) do
if v == Player.SavedData.CurrentCheckPoint.Value then
if i == #CheckpointsSequence then -- Already at last checkpoint
return false
end
NewCheckPoint = CheckpointsSequence[i+1]
break
end
end
if NewCheckPoint == "" then
return false
end
for i, v in ipairs(Checkpoints:GetChildren()) do
if v.Name == NewCheckPoint then
TeleportModule.TeleportPlayer(Player, v.Position)
return true
end
end
return false -- Error Catch
end

ClientToServerRemotes.SkipStage.OnServerInvoke = onSkipStage