Sekarang Anda dapat mendeteksi ketika seorang pemain telah mengumpulkan koin, Anda perlu menghitung berapa banyak koin yang telah dikumpulkan pemain dan membuat jumlah tersebut 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 diminta oleh skrip lain. Dalam hal ini, CoinService memerlukan skrip modul ini agar dapat memperbarui data pengumpulan koin ketika pemain menyentuh koin.
Di ServerStorage, buat ModuleScript bernama PlayerData dengan kode berikut:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Koin"
local playerData = {
--[[
[userId: string] = {
["Koin"] = jumlahKoin: number
}
]]
}
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
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
return PlayerData
```Skrip modul mendefinisikan tabel PlayerData yang berisi nol atau banyak tabel playerData, yang mewakili 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 berisi metode akses untuk mendapatkan dan mengatur nilai dalam tabel.
Tabel playerData berisi komentar yang menjelaskan struktur tabel, yang membuat kode lebih mudah dipahami. Dalam hal ini, tabel playerData berisi userId dan bidang yang sesuai bernama Koin yang mewakili jumlah koin yang dikumpulkan untuk pemain tersebut.
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Koin"
local playerData = {
--[[
[userId: string] = {
["Koin"] = jumlahKoin: number
}
]]
}
...
return PlayerDataDefinisikan akses data lokal
getData() adalah fungsi lokal yang mengambil data untuk tabel playerData tertentu. Jika seorang pemain belum mengumpulkan koin, ia mengembalikan tabel dari fungsi defaultPlayerData() untuk memastikan setiap pemain memiliki beberapa data yang terkait dengan mereka. Konvensi umum adalah membuat fungsi sederhana yang dapat diakses publik yang memindahkan logika ke fungsi yang memiliki 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
endDefinisikan akses data publik
getValue() dan updateValue() adalah fungsi yang dapat diakses publik yang dapat dipanggil oleh skrip lain yang memerlukan skrip modul ini. Dalam kasus kami, CoinService menggunakan fungsi-fungsi ini untuk memperbarui data pengumpulan koin 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
endImplementasikan papan peringkat
Anda dapat mewakili data pengumpulan koin secara visual dengan papan peringkat di layar. Roblox menyertakan sistem bawaan yang secara otomatis menghasilkan papan peringkat menggunakan UI default.
Di ServerStorage, buat ModuleScript bernama Leaderboard dengan kode berikut:
```lua
local Leaderboard = {}
-- 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 statistik 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
-- Memperbarui nilai statistik 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
return Leaderboard
```Bagian berikut menjelaskan bagaimana papan peringkat bekerja dengan lebih detail.
Buat papan peringkat
Fungsi setupLeaderboard() membuat instance folder baru bernama leaderstats dan mengaturnya sebagai anak dari pemain yang ditentukan. Roblox secara otomatis mengenali folder bernama leaderstats sebagai wadah statistik dan membuat elemen UI untuk menampilkan statistik tersebut. Ini mengharuskan nilai-nilai dalam 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 statistik papan peringkat baru
local function setupStat(leaderstats, statName)
local stat = Instance.new("IntValue")
stat.Name = statName
stat.Value = 0
stat.Parent = leaderstats
return stat
endPerbarui statistik pemain
setStat() adalah satu-satunya fungsi publik dalam modul Leaderboard. Ini membuat nilai statistik untuk pemain tertentu atau papan peringkat itu sendiri jika belum ada.
FindFirstChild() mengambil nama objek dan mengembalikan objek tersebut jika ada, atau nil jika tidak ada. Ini adalah metode umum dan aman untuk mengetahui apakah sebuah objek ada sebelum Anda menggunakannya.
-- Memperbarui nilai statistik 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
endIntegrasikan skrip modul
Dengan kedua modul di tempatnya, minta mereka dalam skrip CoinService untuk mengelola dan menampilkan data koin pemain.
Di ServerScriptService, ganti kode skrip CoinService yang ada dengan kode berikut:
```lua
-- Menginisialisasi layanan dan variabel
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Modul
local Leaderboard = require(ServerStorage.Leaderboard)
local PlayerData = require(ServerStorage.PlayerData)
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
local COOLDOWN = 10
local COIN_AMOUNT_TO_ADD = 1
local function updatePlayerCoins(player, updateFunction)
-- Perbarui tabel koin
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
-- Perbarui papan peringkat koin
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
end
-- Mendefinisikan penangan acara
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Pemain menyentuh koin
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
updatePlayerCoins(player, function(oldCoinAmount)
oldCoinAmount = oldCoinAmount or 0
return oldCoinAmount + COIN_AMOUNT_TO_ADD
end)
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- Mengatur pendengar acara
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```Perubahan pada skrip CoinService yang asli mencakup:
- 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 yang terkait.
- Mengganti pernyataan placeholder print() dalam onCoinTouched() dengan panggilan ke updatePlayerCoins().
Uji Coba
Pilih Test dari dropdown dan klik Play. Masuk ke koin dan konfirmasi bahwa papan peringkat muncul di sudut dan bahwa jumlah koin Anda meningkat saat Anda mengumpulkan lebih banyak koin.