Merekam dan menampilkan data pemain

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.


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 PlayerData

Di ServerStorage, buat ModuleScript bernama PlayerData dengan kode berikut:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Koin"
local playerData = {
--[[
[userId: string] = {
["Koin"] = coinAmount: 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 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 Leaderboard

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 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
-- 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
return 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 CoinService

Di ServerScriptService, ganti kode dalam 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 handler event
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 event
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 meliputi:

  • Mengimpor modul PlayerData dan Leaderboard dengan fungsi require().
  • 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.

©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.