4. Buat sistem coin
Yang akan kamu pelajari
Section titled “Yang akan kamu pelajari”Di akhir materi ini, kamu akan bisa:
- Mengorganisir banyak koin di dalam Folder
Coins. - Membuat
CoinServicediServerScriptService. - Mengiterasi seluruh koin dengan loop dan menghubungkan event
Touched. - Menggunakan modul
PlayerDatadanLeaderboarduntuk menambah saldo koin pemain. - Menerapkan mekanisme cooldown respawn koin.
Lihat prosesnya dulu
Section titled “Lihat prosesnya dulu”Video singkat resmi Roblox ini memperlihatkan gambaran sistem coin: pemain menyentuh coin, game mendeteksi sentuhan, lalu coin dinonaktifkan sementara. Tonton alurnya dulu, kemudian gunakan kode dan checkpoint di halaman ini untuk membuat versimu sendiri.
Video resmi Roblox Documentation. Durasi dan bahasa mengikuti video aslinya.
Sebelum mulai
Section titled “Sebelum mulai”- Selesaikan materi Jalankan GameServer utama.
- Pastikan modul
LeaderboarddanPlayerDatasudah ada diServerStorage.
1. Siapkan Folder Coins di Workspace
Section titled “1. Siapkan Folder Coins di Workspace”Alih-alih menaruh skrip di dalam setiap koin, arsitektur yang bersih mengelompokkan semua koin ke dalam satu Folder:
- Di dalam
Workspace.Map(atauWorkspace.World), buat sebuah Folder baru bernamaCoins. - Buat sebuah
Partberbentuk Cylinder (atau koin emas). - Atur warnanya menjadi kuning cerah, aktifkan
Anchored = true, dan matikanCanCollide = false. - Beri nama
Coindan masukkan ke dalam folderCoins. - Duplikasi
Cointersebut menjadi beberapa buah dan sebar di atas platform rintangan.
2. Buat CoinService di ServerScriptService
Section titled “2. Buat CoinService di ServerScriptService”- Di
ServerScriptService, tambahkanScriptbaru. - Ubah namanya menjadi
CoinService. - 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;
Touch["<b>Koin Disentuh</b><br/>coin.Touched"]:::trigger Check{"<b>Validasi</b><br/>Koin aktif & pemain hidup?"}:::condition Reward["<b>Beri Hadiah</b><br/>+1 Koin & update papan skor"]:::action Cooldown["<b>Cooldown</b><br/>Sembunyi selama 5 detik"]:::action Respawn(["<b>Respawn Koin</b><br/>Muncul kembali & aktif"]):::finish Ignore(["<b>Abaikan</b><br/>Batalkan proses"]):::finish
Touch --> Check Check -- "Ya" --> Reward --> Cooldown --> Respawn Check -- "Tidak" --> Ignore- Baris 1-9: Menghubungkan service Roblox dan memuat module data
LeaderboardsertaPlayerData. - Baris 11-14: Menentukan folder lokasi koin di Workspace dan mengambil seluruh instance koin di dalamnya.
- Baris 16-18: Menentukan konstanta nama statistik koin, durasi jeda kemunculan (
COOLDOWN = 5detik), dan jumlah koin per ambil (1). - Baris 20-23: Fungsi
updatePlayerCoinsmemperbarui data koin di modulPlayerDatasekaligus menyinkronkan angka papan skor diLeaderboard. - Baris 25-50: Fungsi
onCoinTouchedmemvalidasi sentuhan pemain yang hidup, menonaktifkan koin (SetAttribute("Enabled", false)), menyembunyikan part (Transparency = 1), menambahkan koin, dan memunculkan kembali setelah jeda cooldown. - Baris 53-61: Loop
forotomatis memasang event listener ke setiap koin di dalam folder, tanpa perlu menempelkan skrip satu per satu ke setiap koin.
local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")
-- Moduleslocal Leaderboard = require(ServerStorage:WaitForChild("Leaderboard"))local PlayerData = require(ServerStorage:WaitForChild("PlayerData"))
-- Folder Koinlocal mapFolder = Workspace:WaitForChild("Map")local coinsFolder = mapFolder:WaitForChild("Coins")local coins = coinsFolder:GetChildren()
local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 5local COIN_AMOUNT_TO_ADD = 1
local function updatePlayerCoins(player, updateFunction) local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction) Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end
local function onCoinTouched(otherPart, coin) if coin:GetAttribute("Enabled") then local character = otherPart.Parent local player = Players:GetPlayerFromCharacter(character) local humanoid = character and character:FindFirstChildOfClass("Humanoid")
if not player or not humanoid or humanoid.Health <= 0 then return end
-- Nonaktifkan koin sementara coin:SetAttribute("Enabled", false) coin.Transparency = 1
-- Berikan koin ke pemain updatePlayerCoins(player, function(oldAmount) oldAmount = oldAmount or 0 return oldAmount + COIN_AMOUNT_TO_ADD end)
print(player.Name .. " mengambil koin! Total: " .. (PlayerData.getValue(player, COIN_KEY_NAME) or 0))
-- Cooldown respawn task.wait(COOLDOWN) coin.Transparency = 0 coin:SetAttribute("Enabled", true) endend
-- Pasang deteksi sentuh pada semua koinfor _, coin in ipairs(coins) do if coin:IsA("BasePart") then coin:SetAttribute("Enabled", true) coin.Touched:Connect(function(otherPart) onCoinTouched(otherPart, coin) end) endendSalin prompt berikut ke chat AI di Visual Studio Code (dengan Roblox Studio MCP aktif):
Buatkan Script bernama "CoinService" di ServerScriptService:- Hubungkan semua koin di Workspace.Map.Coins.- Saat koin disentuh pemain hidup: tambah 1 koin ke leaderboard, sembunyikan koin, lalu munculkan lagi setelah 5 detik.Checkpoint
Section titled “Checkpoint”Materi ini selesai jika:
- Seluruh part koin berada di dalam folder
Coins; CoinServiceberada di dalamServerScriptService;- menyentuh koin menambah angka koin di tabel leaderboard;
- koin menghilang sementara lalu muncul kembali setelah cooldown;
- tidak ada pesan error merah di jendela Output.
Tantangan
Section titled “Tantangan”Ubah nilai konstanta COOLDOWN atau COIN_AMOUNT_TO_ADD di bagian atas CoinService. Perhatikan bagaimana perubahan satu baris konstanta di service langsung mempengaruhi seluruh koin di dalam game secara bersamaan.
Rangkuman
Section titled “Rangkuman”Kamu telah membuat sistem koin terpusat dengan CoinService. Dengan pola arsitektur service, mengelola puluhan bahkan ratusan koin di map menjadi sangat mudah dan terorganisir.