Sekarang Anda dapat mendeteksi ketika seorang pemain telah mengumpulkan koin, Anda perlu menghitung berapa banyak koin yang telah dikumpulkan pemain dan membuat jumlah itu terlihat di papan peringkat.
Buat skrip modul untuk merekam pengumpulan koin
Untuk menangani penyimpanan dan pengelolaan data pengumpulan koin setiap pemain, Anda perlu membuat objek ModuleScript untuk memuat struktur data dan fungsi yang mengakses data pengumpulan koin untuk setiap pemain. Skrip modul adalah kode yang dapat digunakan kembali yang dapat dipanggil oleh skrip lain. Dalam hal ini, CoinService memerlukan skrip modul ini sehingga dapat memperbarui data pengumpulan koin saat pemain menyentuh koin.
Buat PlayerDataDi ServerStorage, buat ModuleScript bernama PlayerData dengan kode berikut:```lualocal PlayerData = {}PlayerData.COIN_KEY_NAME = "Koin"local playerData = {--[[[userId: string] = {["Koin"] = coinAmount: number}]]}local function defaultPlayerData()return {[PlayerData.COIN_KEY_NAME] = 0}endlocal function getData(player)local data = playerData[tostring(player.UserId)] or defaultPlayerData()playerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerData```
Skrip modul mendefinisikan tabel PlayerData yang berisi nol atau banyak tabel playerData, yang merepresentasikan data pengumpulan koin untuk seorang pemain. Setiap skrip yang memerlukan skrip modul ini menerima salinan yang sama dari tabel PlayerData, memungkinkan beberapa skrip untuk memodifikasi dan berbagi data pengumpulan koin.
Deklarasikan struktur data
Skrip modul dimulai dengan deklarasi tabel kosong, PlayerData, yang dikembalikan di akhir skrip. Ini juga mengandung metode akses untuk mendapatkan dan menyetel nilai dalam tabel.
Tabel playerData berisi komentar yang menggambarkan struktur tabel, yang membuat kode lebih mudah dipahami. Dalam hal ini, tabel playerData berisi userId dan field yang sesuai bernama Koin yang merepresentasikan jumlah koin yang telah dikumpulkan untuk pemain tersebut.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Koin"local playerData = {--[[[userId: string] = {["Koin"] = coinAmount: number}]]}...return PlayerData
Definisikan akses data lokal
getData() adalah fungsi lokal yang mengambil data untuk tabel playerData tertentu. Jika seorang pemain belum mengumpulkan koin, fungsi ini mengembalikan tabel dari fungsi defaultPlayerData() untuk memastikan setiap pemain memiliki data yang terasosiasi dengan mereka. Sebuah konvensi umum adalah untuk membuat fungsi publik yang sederhana yang mengalihkan logika ke fungsi dengan ruang lingkup lokal yang melakukan pekerjaan berat.
local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
playerData[tostring(player.UserId)] = data
return data
end
Definisikan akses data publik
getValue() dan updateValue() adalah fungsi yang dapat dipanggil oleh skrip lain yang memerlukan skrip modul ini. Dalam kasus ini, CoinService menggunakan fungsi-fungsi ini untuk memperbarui data pengumpulan koin seorang pemain setiap kali pemain tersebut menyentuh koin.
function PlayerData.getValue(player, key)
return getData(player)[key]
end
function PlayerData.updateValue(player, key, updateFunction)
local data = getData(player)
local oldValue = data[key]
local newValue = updateFunction(oldValue)
data[key] = newValue
return newValue
end
Implementasikan papan peringkat
Anda dapat mewakili data pengumpulan koin secara visual dengan papan peringkat di layar. Roblox menawarkan sistem built-in yang secara otomatis menghasilkan papan peringkat menggunakan UI default.
Buat LeaderboardDi ServerStorage, buat ModuleScript bernama Leaderboard dengan kode berikut:```lualocal Leaderboard = {}-- Membuat papan peringkat barulocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' adalah nama yang dicadangkan yang dikenali Roblox untuk membuat papan peringkatleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Membuat nilai status papan peringkat barulocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Memperbarui nilai status pemainfunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn Leaderboard```
Bagian berikut menjelaskan cara kerja papan peringkat dengan lebih rinci.
Buat papan peringkat
Fungsi setupLeaderboard() membuat instansi folder baru bernama leaderstats dan menetapkannya sebagai anak dari pemain yang ditentukan. Roblox secara otomatis mengenali folder bernama leaderstats sebagai wadah untuk statistik dan membuat elemen UI untuk menampilkan statistik. Ini membutuhkan nilai di leaderstats disimpan sebagai objek "nilai" (seperti StringValue, IntValue atau NumberValue).
-- Membuat papan peringkat baru
local function setupLeaderboard(player)
local leaderstats = Instance.new("Folder")
-- 'leaderstats' adalah nama yang dicadangkan yang dikenali Roblox untuk membuat papan peringkat
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
return leaderstats
end
-- Membuat nilai status papan peringkat baru
local function setupStat(leaderstats, statName)
local stat = Instance.new("IntValue")
stat.Name = statName
stat.Value = 0
stat.Parent = leaderstats
return stat
end
Perbarui statistik pemain
setStat() adalah satu-satunya fungsi publik dalam modul Leaderboard. Fungsi ini membuat nilai statistik untuk pemain tertentu atau papan peringkat itu sendiri jika belum ada.
FindFirstChild() mengambil nama objek dan mengembalikan objek jika ada, atau nil jika tidak. Ini adalah metode umum yang aman untuk mengetahui apakah objek ada sebelum Anda menggunakannya.
-- Memperbarui nilai status pemain
function Leaderboard.setStat(player, statName, value)
local leaderstats = player:FindFirstChild("leaderstats")
if not leaderstats then
leaderstats = setupLeaderboard(player)
end
local stat = leaderstats:FindFirstChild(statName)
if not stat then
stat = setupStat(leaderstats, statName)
end
stat.Value = value
end
Integrasikan skrip modul
Dengan kedua modul sudah siap, panggil keduanya dalam skrip CoinService untuk mengelola dan menampilkan data koin pemain.
Perbarui CoinServiceDi ServerScriptService, ganti kode dalam Skrip CoinService yang ada dengan kode berikut:```lua-- Menginisialisasi layanan dan variabellocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Modullocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local function updatePlayerCoins(player, updateFunction)-- Perbarui tabel koinlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Perbarui papan peringkat koinLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Mendefinisikan handler eventlocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Pemain menyentuh koincoin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Mengatur pendengar eventfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
Perubahan pada skrip CoinService yang asli meliputi:
- Mendeklarasikan COIN_AMOUNT_TO_ADD sebagai jumlah koin yang akan ditambahkan ketika seorang pemain mengumpulkan koin, dan COIN_KEY_NAME sebagai nama kunci yang didefinisikan dalam PlayerData.
- Membuat fungsi pembantu updatePlayerCoins() untuk memperbarui jumlah koin pemain dan statistik papan peringkat terkait.
- Mengganti pernyataan placeholder print() dalam onCoinTouched() dengan pemanggilan ke updatePlayerCoins().
Uji Coba
Pilih Uji dari dropdown dan klik Mainkan. Masuk ke dalam sebuah koin dan pastikan bahwa papan peringkat muncul di pojok dan bahwa jumlah koin Anda meningkat saat Anda mengumpulkan lebih banyak koin.