6. Buat checkpoint
Yang akan kamu pelajari
Section titled “Yang akan kamu pelajari”Di akhir materi ini, kamu akan bisa:
- Membedakan peran SpawnLocation awal dan Checkpoint.
- Mengorganisir checkpoint di dalam Folder
Checkpointsmenggunakan PartPaddan atributStage. - Membuat
CheckpointServicediServerScriptService. - Mengatur progres berurutan (Stage 1 -> Stage 2 -> dst.).
- Menempatkan karakter di posisi checkpoint aktif saat respawn dengan
CharacterAdded.
Sebelum mulai
Section titled “Sebelum mulai”- Selesaikan materi Tambahkan hazard.
- Pastikan kamu memiliki satu
SpawnLocationawal di area mulai. - Pastikan modul
LeaderboarddanPlayerDatasudah ada diServerStorage.
Beda SpawnLocation awal dan Checkpoint
Section titled “Beda SpawnLocation awal dan Checkpoint”Sebelum membuat objeknya, pahami dulu perbedaannya:
- SpawnLocation (SpawnPoint Awal): Tempat pemain pertama kali muncul saat baru bergabung (join game). Dalam satu map obby sederhana, cukup sediakan satu
SpawnLocationutama. - Checkpoint: Titik simpan progres level di tengah rute. Kita menggunakan Part/Model biasa untuk checkpoint agar pemain baru tidak muncul sembarangan di tengah rintangan.
1. Siapkan Model Checkpoint di Workspace
Section titled “1. Siapkan Model Checkpoint di Workspace”- Di dalam
Workspace.Map(atauWorkspace.World), buat sebuah Folder bernamaCheckpoints. - Buat sebuah Part bernama
Pad(sebagai pijakan checkpoint), aturAnchored = true,CanCollide = true, dan beri warna hijau/neon. - Klik kanan pada part
Paddan pilih Group as Model. Ubah nama Model menjadiCheckpoint_1. - Di panel Properties untuk
Checkpoint_1, tambahkan Attribute baru:- Name:
Stage - Type:
number - Value:
1
- Name:
- Masukkan model
Checkpoint_1ke dalam folderCheckpoints. - Kamu bisa menduplikasi model ini menjadi
Checkpoint_2dengan attributeStage = 2di area rute berikutnya.
2. Buat CheckpointService di ServerScriptService
Section titled “2. Buat CheckpointService di ServerScriptService”- Di
ServerScriptService, buat sebuahScriptbaru. - Ubah namanya menjadi
CheckpointService. - Isi kodenya dengan:
flowchart LR classDef trigger fill:#0369a1,stroke:#38bdf8,stroke-width:2px,color:#ffffff; classDef condition fill:#b45309,stroke:#f59e0b,stroke-width:2px,color:#ffffff; classDef action fill:#047857,stroke:#10b981,stroke-width:2px,color:#ffffff; classDef finish fill:#334155,stroke:#94a3b8,stroke-width:2px,color:#ffffff;
Step["<b>Injak Pad</b><br/>pad.Touched"]:::trigger Check{"<b>Validasi</b><br/>Stage berikutnya?"}:::condition Save["<b>Simpan Progres</b><br/>Update Stage di leaderboard"]:::action Ignore(["<b>Abaikan</b><br/>Sudah lewat"]):::finish
Respawn["<b>Respawn</b><br/>CharacterAdded"]:::trigger Teleport(["<b>Teleportasi</b><br/>Pindah ke Pad aktif"]):::finish
Step --> Check Check -- "Ya" --> Save Check -- "Tidak" --> Ignore Respawn --> Teleport- Baris 1-12: Memuat services, modules
Leaderboard&PlayerData, serta referensi ke folderCheckpoints. - Baris 15-22: Fungsi
getCheckpointByStagemelakukan pencarian model checkpoint yang memiliki atributStageyang cocok. - Baris 25-38: Fungsi
teleportToStagememindahkanHumanoidRootPartkarakter sedikit di atas partPad(+ Vector3.new(0, 3.5, 0)). - Baris 40-57: Mengelola event
PlayerAddeddanCharacterAddeduntuk otomatis memindahkan karakter ke stage terakhir saat respawn. - Baris 60-84: Memasang event
Touchedke setiapPad. Saat pemain menyentuh checkpoint berikutnya (stageNumber == currentStage + 1), dataStagepemain diupdate diPlayerDatadan ditampilkan diLeaderboard.
local Players = game:GetService("Players")local Workspace = game:GetService("Workspace")local ServerStorage = game:GetService("ServerStorage")
-- Moduleslocal Leaderboard = require(ServerStorage:WaitForChild("Leaderboard"))local PlayerData = require(ServerStorage:WaitForChild("PlayerData"))
local STAGE_KEY_NAME = PlayerData.STAGE_KEY_NAME or "Stage"local mapFolder = Workspace:WaitForChild("Map")local checkpointsFolder = mapFolder:WaitForChild("Checkpoints")
-- Mencari model checkpoint berdasarkan nomor stagelocal function getCheckpointByStage(stageNumber) for _, model in ipairs(checkpointsFolder:GetChildren()) do if model:GetAttribute("Stage") == stageNumber then return model end end return nilend
-- Teleportasi karakter ke posisi pad checkpointlocal function teleportToStage(character, stageNumber) local checkpoint = getCheckpointByStage(stageNumber) if not checkpoint then return end
local pad = checkpoint:FindFirstChild("Pad") or checkpoint.PrimaryPart if not pad then return end
local hrp = character:WaitForChild("HumanoidRootPart", 5) if hrp then task.wait(0.05) -- Jeda singkat agar inisialisasi fisika karakter siap if character and character.Parent and hrp.Parent then hrp.CFrame = CFrame.new(pad.Position + Vector3.new(0, 3.5, 0)) end endend
local function onCharacterAdded(player, character) local currentStage = PlayerData.getValue(player, STAGE_KEY_NAME) or 1 Leaderboard.setStat(player, STAGE_KEY_NAME, currentStage) teleportToStage(character, currentStage)end
local function onPlayerAdded(player) local currentStage = PlayerData.getValue(player, STAGE_KEY_NAME) or 1 Leaderboard.setStat(player, STAGE_KEY_NAME, currentStage)
player.CharacterAdded:Connect(function(character) onCharacterAdded(player, character) end)
if player.Character then onCharacterAdded(player, player.Character) endend
-- Hubungkan event sentuh ke setiap checkpoint di folderfor _, checkpointModel in ipairs(checkpointsFolder:GetChildren()) do local stageNumber = checkpointModel:GetAttribute("Stage") local pad = checkpointModel:FindFirstChild("Pad")
if pad and stageNumber then pad.Touched:Connect(function(otherPart) local character = otherPart.Parent local player = Players:GetPlayerFromCharacter(character) if not player then return end
local humanoid = character:FindFirstChildWhichIsA("Humanoid") if not humanoid or humanoid.Health <= 0 then return end
local currentStage = PlayerData.getValue(player, STAGE_KEY_NAME) or 1
-- Progres berurutan: Stage 1 -> Stage 2 -> dst. if stageNumber == currentStage + 1 then local newStage = PlayerData.updateValue(player, STAGE_KEY_NAME, function() return stageNumber end) Leaderboard.setStat(player, STAGE_KEY_NAME, newStage) print(player.Name .. " mencapai Stage " .. newStage .. "!") end end) endend
for _, player in ipairs(Players:GetPlayers()) do onPlayerAdded(player)end
Players.PlayerAdded:Connect(onPlayerAdded)Salin prompt berikut ke chat AI di Visual Studio Code (dengan Roblox Studio MCP aktif):
Buatkan Script bernama "CheckpointService" di ServerScriptService:- Saat pemain menginjak pad checkpoint baru, naikkan nilai Stage di leaderboard.- Saat pemain respawn, teleport karakter ke posisi checkpoint terakhir yang dicapai.Uji alurnya
Section titled “Uji alurnya”- Tekan Play dan pastikan statistik Stage di leaderboard bernilai
1. - Lewati rintangan hingga mencapai
Checkpoint_1(Stage 2). - Injak pad checkpoint dan pastikan Stage di leaderboard berubah menjadi
2. - Kalahkan karaktermu (sentuh hazard atau gunakan menu Reset Character).
- Pastikan karaktermu muncul kembali tepat di atas checkpoint
Stage 2, bukan di spawn awal.
Checkpoint
Section titled “Checkpoint”Materi ini selesai jika:
- Seluruh model checkpoint berada di dalam folder
Checkpointsdan memiliki partPadserta atributStage; CheckpointServiceaktif di dalamServerScriptService;- angka Stage di leaderboard bertambah secara berurutan saat checkpoint disentuh;
- karakter respawn tepat di atas checkpoint stage terakhir;
- tidak ada pesan error merah di jendela Output.
Tantangan
Section titled “Tantangan”Tambahkan efek visual atau suara saat checkpoint disentuh (misal partikel Sparkles atau perubahan warna part Pad menjadi hijau terang).
Rangkuman
Section titled “Rangkuman”Kamu telah membuat sistem checkpoint profesional menggunakan CheckpointService. Sistem ini mengelola urutan stage dan teleportasi respawn secara otomatis tanpa menyentuh pengaturan rumit SpawnLocation.