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 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.

Buat PlayerData
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 PlayerData

Definisikan 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
end

Definisikan 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
end

Implementasikan 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.

Buat Papan Peringkat
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
end

Perbarui 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
end

Integrasikan skrip modul

Dengan kedua modul di tempatnya, minta mereka dalam skrip CoinService untuk mengelola dan menampilkan data koin pemain.

Perbarui CoinService
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:

  • 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 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.

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