Memulai
Tutorial menengah

Buat papan peringkat kustom dengan penyimpanan data terurut

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

Penyimpanan data adalah layanan yang bisa Anda gunakan untuk menyimpan dan memuat data pemain yang persisten di antara sesi pemain yang berbeda. Mereka menyimpan informasi penting, seperti kemajuan atau inventaris pemain, dan memungkinkan Anda untuk mengambilnya untuk pemain pada saat mereka bergabung kembali ke permainan Anda. Tanpa penyimpanan data, seorang pemain akan kehilangan semua kemajuan mereka setiap kali mereka meninggalkan permainan.

Ada dua jenis penyimpanan data: standar dan terurut. Tutorial ini menggunakan penyimpanan data terurut, yang menyimpan data yang dapat Anda peringkatkan dan urutkan secara numerik dan dapat diambil dalam urutan menaik atau menurun berdasarkan nilai numerik yang disimpan.

Menggunakan file Gold Rush buat tutorial papan peringkat - Mulai .rbxl sebagai tempat mulai dan file Gold Rush buat tutorial papan peringkat - Lengkap .rbxl sebagai referensi, tutorial ini memberikan fondasi yang Anda butuhkan untuk membuat papan peringkat pemain kustom, termasuk panduan tentang:

  • Menyimpan skor emas dalam penyimpanan data terurut.
  • Mengambil dan mengurutkan skor tertinggi secara global di seluruh server.
  • Menampilkan skor tertinggi dalam papan peringkat kustom di UI.
  • Secara otomatis menyegarkan papan peringkat kustom setiap beberapa detik.

Di akhir tutorial ini, Anda seharusnya memiliki yang berikut:

  1. Di bawah ServerScriptService:
    1. Skrip GoldManager yang diperbarui yang menyimpan skor pemain ke penyimpanan data terurut untuk papan peringkat.
    2. Skrip modul LeaderboardRemoteHandler baru yang mengambil dan mengembalikan daftar terpadu dari skor tertinggi dari papan peringkat.
    3. Skrip LeaderboardManager baru yang merespons permintaan data papan peringkat dari klien, bertindak sebagai jembatan antara klien dalam LeaderboardGuiScript dan server di LeaderboardManager.
  2. Di bawah StarterGui, skrip lokal baru LeaderboardGuiScript yang merender UI papan peringkat untuk pemain.

Aktifkan akses Studio ke layanan API

Penyimpanan data tidak disimpan secara lokal di perangkat Anda, jadi permainan Anda bergantung pada komunikasi server-ke-server dengan backend Roblox untuk menggunakannya. Secara default, Studio membatasi komunikasi ini untuk mencegah penyalahgunaan atau penggunaan yang tidak sengaja. Akses ke layanan API di Studio dinonaktifkan sampai Anda secara eksplisit mengaktifkannya untuk memastikan bahwa hanya permainan terpercaya yang dapat membaca dan menulis ke server backend Roblox.

Untuk mengaktifkan akses Studio ke layanan API agar Anda dapat menggunakan penyimpanan data:

  1. Buka file Gold Rush buat tutorial papan peringkat - Mulai di Studio. File tempat mulai ini sudah memasukkan kode dari tutorial Simpan data pemain dan kerangka UI untuk papan peringkat pemain.
  2. Kembali di Studio, pergi ke FilePengaturan PengalamanKeamanan.
  3. Aktifkan Aktifkan Akses Studio ke Layanan API.
  4. Simpan perubahan Anda.

Buat penyimpanan data terurut

Saat membuat penyimpanan data, Anda harus selalu memanggil DataStoreService dari Script sisi server. Melakukannya sangat penting karena:

  • Roblox memblokir semua akses penyimpanan data dari klien sehingga hanya server yang memiliki izin untuk mengakses dan memodifikasi data pemain yang persisten.
  • Skrip sisi server berjalan dalam lingkungan terpusat, memastikan bahwa data yang dibaca dan ditulis ke penyimpanan data Anda akurat dan valid.
  • Karena skrip sisi klien berjalan di perangkat pemain, pemain mana pun dapat mengeksploitasi permainan dan mencuri atau menimpa data pemain lain jika klien memiliki akses ke penyimpanan data Anda.

Anda juga harus memberi penyimpanan data Anda nama yang unik untuk menjaga data Anda tetap teratur dan untuk mencegahnya tumpang tindih atau bertentangan di penyimpanan data yang berbeda. Dalam tutorial ini, penyimpanan data untuk papan peringkat disebut GlobalLeaderboard.

Untuk membuat penyimpanan data terurut GlobalLeaderboard:

  1. Buka skrip GoldManager yang ada di bawah ServerScriptService.

  2. Di bawah penyimpanan data PlayerGold yang ada, panggil GetOrderedDataStore dengan string "GlobalLeaderboard". Ini membuat penyimpanan data terurut untuk menyimpan skor pemain saat mereka mendapatkan emas.


    local leaderboardStore = DataStoreService:GetOrderedDataStore("GlobalLeaderboard")

Setelah membuat penyimpanan data, Anda dapat merujuk ke penyimpanan data yang sama ini di berbagai skrip. Sebagai contoh, Anda dapat memanggil GetOrderedDataStore di skrip GoldManager dan skrip modul LeaderboardManager yang akan Anda buat nanti dalam tutorial ini. Merujuk ke penyimpanan data yang sama di dua tempat tidak berarti Anda menggandakan data; itu hanya berarti bahwa dua skrip sedang mengakses penyimpanan terpusat yang sama, seperti dua rekan tim yang menggunakan satu folder untuk berbagi informasi.

Kirim data pemain ke papan peringkat

Penyimpanan data terdiri dari kunci, yang mengidentifikasi data, dan nilai, yang menyimpan data. Berbeda dengan penyimpanan data standar, penyimpanan data terurut memungkinkan Anda untuk mengurutkan data berdasarkan nilai, yang menjadikannya ideal untuk membuat sesuatu seperti papan peringkat.

Setiap entri dalam penyimpanan data terurut disimpan di bawah kunci unik yang dapat Anda peringkat dan urutkan secara numerik, dan kemudian mengembalikan dalam urutan menaik atau menurun berdasarkan nilai numerik yang disimpan. Ini berarti bahwa Anda dapat menggunakan penyimpanan data terurut untuk, misalnya, menunjukkan daftar 3 teratas yang diperbarui secara real-time saat pemain dalam permainan Anda mengumpulkan lebih banyak emas.

KunciNilai
DeskripsiSebuah kunci adalah pengidentifikasi string unik yang dapat Anda gunakan untuk mengakses bagian spesifik dari data, seperti ID pengguna pemain.

Kunci memungkinkan Anda mengatur data Anda sehingga Anda dapat dengan mudah mengelola dan melakukan debugging.
Sebuah nilai adalah data numerik aktual yang ingin Anda simpan atau muat, seperti skor pemain.

Nilai memungkinkan Anda menyimpan kemajuan di antara sesi, serta mengambil data pemain saat mereka bergabung kembali ke permainan Anda.
Format yang DiizinkanHanya dapat berupa string. Jika Anda menggunakan angka, seperti ID pengguna, ubah mereka menjadi string menggunakan tostring().Hanya dapat berupa angka.
Contoh"Player_A", "TopScore", "123456" (userId sebagai string)100, 3.14, 0, -25

Sekarang Anda telah membuat penyimpanan data terurut GlobalLeaderboard, perbarui fungsi saveGold yang ada di skrip GoldManager untuk mengirim skor emas pemain ke papan peringkat kustom Anda dengan SetAsync:


local function saveGold(player, value)
local userId = player.UserId
local success, err = pcall(function()
goldStore:SetAsync(userId, value)
leaderboardStore:SetAsync(tostring(userId), value)
end)
if not success then
warn("Tidak dapat menyimpan emas untuk", player.Name, ":", err)
end
end

Anda dapat menganggap penyimpanan data terurut GlobalLeaderboard seperti folder bersama: SetAsync menambahkan konten ke dalam folder, sementara GetSortedAsync (yang akan Anda buat nanti di skrip modul LeaderboardManager) membaca konten folder dan mengurutkannya berdasarkan skor.

Ambil skor papan peringkat

Untuk mengambil skor papan peringkat, Anda harus menggunakan ModuleScript. Skrip modul memungkinkan Anda mengatur dan menggunakan kembali kode Anda di berbagai skrip. Daripada menyalin logika yang sama ke tempat yang berbeda, Anda dapat menuliskannya sekali di skrip modul dan memanggilnya dari mana saja yang membutuhkannya.

Saat Anda menyimpan logika papan peringkat Anda dalam modul, baik pengendal UI dan skrip server dapat menggunakan fungsi yang sama untuk mengambil skor pemain tertinggi. Jika Anda perlu, misalnya, memperbarui cara nama pengguna diambil atau cara skor diurutkan, Anda hanya perlu mengubah kode di satu tempat. Setelah Anda memperbarui modul, semua skrip yang menggunakannya juga secara otomatis mendapatkan perilaku terbaru.

Papan peringkat kustom Anda menggunakan metode penyimpanan data terurut berikut untuk membagikan data di seluruh server yang berbeda:

  • SetAsync (dari skrip GoldManager) untuk mengirim skor pemain ke penyimpanan data terurut GlobalLeaderboard.
  • GetSortedAsync (di skrip modul) untuk mengambil skor tertinggi dari semua server dari penyimpanan data yang sama. Metode GetSortedAsync adalah eksklusif untuk penyimpanan data terurut dan dapat mengambil beberapa kunci terurut berdasarkan urutan pengurutan tertentu, ukuran halaman, dan nilai minimum dan maksimum.

Untuk mengambil skor papan peringkat:

  1. Di bawah ServerScriptService, buat ModuleScript baru bernama LeaderboardManager.

  2. Di bagian atas skrip modul, panggil GetOrderedDataStore dengan string "GlobalLeaderboard". Merujuk ke penyimpanan data terurut yang sama yang Anda buat di skrip GoldManager akan memungkinkan UI papan peringkat untuk mengambil dan mengurutkan skor pemain tertinggi nanti.


    local DataStoreService = game:GetService("DataStoreService")
    local Players = game:GetService("Players")
    local leaderboardStore = DataStoreService:GetOrderedDataStore("GlobalLeaderboard")
  3. Siapkan tabel modul untuk menyimpan semua fungsi dan data yang ingin Anda ungkapkan ke skrip lain.


    local leaderboardManager = {}
  4. Buat fungsi bernama GetTopScores untuk mengambil skor pemain tertinggi. Fungsi ini:

    • Memanggil GetSortedAsync untuk mengambil limit jumlah skor tertinggi dalam urutan menurun. Jika panggilan gagal, daftar kosong dikembalikan untuk mencegah sisa kode Anda dari kerusakan.
    • Mengulangi papan peringkat untuk mendapatkan tabel entri dengan GetCurrentPage dan nama pengguna pemain dengan GetNameFromUserIdAsync.
    • Menambahkan setiap hasil ke dalam daftar akhir dan membangun tabel papan peringkat dengan nama pengguna pemain dan skor mereka.
    • Mengembalikan daftar akhir pemain dan mengirim data papan peringkat kembali ke skrip mana pun yang memanggil fungsi leaderboardManager.GetTopScores ini.

    function leaderboardManager.GetTopScores(limit)
    local success, pages = pcall(function()
    return leaderboardStore:GetSortedAsync(false, limit)
    end)
    if not success or not pages then
    return {}
    end
    local results = {}
    for _, entry in ipairs(pages:GetCurrentPage()) do
    local userId = tonumber(entry.key)
    local score = entry.value
    local username = "Unknown"
    local ok, name = pcall(function()
    return Players:GetNameFromUserIdAsync(userId)
    end)
    if ok then
    username = name
    end
    table.insert(results, {
    Username = username,
    Score = score
    })
    end
    return results
    end
  5. Buat modul menjadi dapat digunakan dengan mengembalikan tabel modul yang Anda buat sebelumnya. Setiap kali Anda membuat skrip modul, Anda harus mengembalikan tabel modulnya agar skrip lain dapat mengaksesnya dan memanggil fungsi-fungsi di dalamnya.


    return leaderboardManager

Minta data papan peringkat dari server

Agar UI klien dapat menampilkan skor papan peringkat, server harus merespons ketika klien meminta data. Sebuah RemoteFunction memungkinkan klien untuk meminta informasi dari server dan menunggu balasan.

Untuk meminta data papan peringkat dari server:

  1. Di bawah ReplicatedStorage, masukkan RemoteFunction bernama LeaderboardRemote. Fungsi remote ini bertindak sebagai jembatan antara skrip UI di klien dan logika papan peringkat di server.
  2. Di bawah ServerScriptService, buat skrip bernama LeaderboardRemoteHandler. Di skrip ini:
    1. Panggil ReplicatedStorage (ruang bersama antara klien dan server), ServerScriptService (yang memegang modul papan peringkat), dan leaderboardRemote (fungsi remote yang akan dipanggil klien untuk meminta data papan peringkat).


      local ReplicatedStorage = game:GetService("ReplicatedStorage")
      local ServerScriptService = game:GetService("ServerScriptService")
      local leaderboardRemote = ReplicatedStorage:WaitForChild("LeaderboardRemote")
    2. Muat modul LeaderboardManager yang Anda buat sebelumnya, yang mencakup fungsi yang mendapatkan skor tertinggi dari penyimpanan data terurut.


      local leaderboardManager = require(ServerScriptService:WaitForChild("LeaderboardManager"))
    3. Atur perilaku untuk saat klien memanggil InvokeServer. Server menjawab dengan mengambil 3 skor tertinggi dan mengirim hasil kembali ke klien.


      leaderboardRemote.OnServerInvoke = function(player)
      return leaderboardManager.GetTopScores(3)
      end

Tampilkan data di UI papan peringkat kustom

Setelah mengatur skrip sisi server, buat skrip lokal untuk mengambil 3 pemain teratas setiap 3 detik dan menampilkan hasilnya dalam UI papan peringkat global di dalam permainan.

Untuk menampilkan data di papan peringkat kustom Anda:

  1. Di bawah StarterGuiLeaderboardGui, buat skrip lokal bernama LeaderboardGuiScript.

  2. Di bagian atas skrip, sambungkan ke fungsi remote. Panggil ReplicatedStorage untuk mendapatkan akses ke objek yang dibagikan antara server dan klien, lalu panggil leaderboardRemote untuk memungkinkan klien meminta data papan peringkat dari server.


    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local leaderboardRemote = ReplicatedStorage:WaitForChild("LeaderboardRemote")
  3. Referensikan elemen UI papan peringkat yang ada di bawah LeaderboardGui.


    local gui = script.Parent
    local leaderboardFrame = gui:WaitForChild("LeaderboardFrame")
    local entriesFrame = leaderboardFrame:WaitForChild("EntriesFrame")
    local template = entriesFrame:WaitForChild("LeaderboardEntry")
  4. Buat fungsi bernama clearEntries untuk menghapus entri papan peringkat lama. Fungsi ini mengulangi semua anak entriesFrame, yang berisi baris papan peringkat, dan memastikan papan peringkat benar-benar disegarkan sebelum menampilkan data baru.


    local function clearEntries()
    for _, child in ipairs(entriesFrame:GetChildren()) do
    if child:IsA("TextLabel") and child.Name:match("^Row%d+$") then
    child:Destroy()
    end
    end
    end
  5. Buat fungsi bernama renderLeaderboard untuk menyisipkan dan menampilkan data pemain dalam baris papan peringkat. Objek data adalah tabel yang dikembalikan oleh server yang berisi entri dengan nama pengguna pemain dan skor.


    local function renderLeaderboard(data)
    clearEntries()
    for i, entry in ipairs(data) do
    local row = template:Clone()
    row.Name = "Row" .. i
    row.Visible = true
    row.LayoutOrder = i
    row.Text = string.format("%d%s tempat: %s - %d",
    i, i == 1 and "st" or i == 2 and "nd" or i == 3 and "rd" or "th",
    entry.Username, entry.Score)
    row.Parent = entriesFrame
    end
    end
  6. Buat loop untuk secara berkala mengambil data papan peringkat. Setiap 3 detik, loop berjalan dan memanggil server menggunakan fungsi InvokeServer yang Anda buat sebelumnya di skrip LeaderboardRemoteHandler. Jika panggilan berhasil, UI memperbarui dengan skor terbaru.


    while true do
    local success, data = pcall(function()
    return leaderboardRemote:InvokeServer()
    end)
    if success and data then
    renderLeaderboard(data)
    end
    task.wait(3)
    end

Kode akhir

Lihat potongan kode berikut untuk skrip lengkap GoldManager, LeaderboardManager, LeaderboardRemoteHandler, dan LeaderboardGuiScript. Anda dapat menempelkan dan menjalankannya langsung di file Gold Rush buat tutorial papan peringkat - Mulai .rbxl di Studio.

GoldManager

Skrip GoldManager membuat penyimpanan data terurut untuk mengelola pembaruan papan peringkat.


-- Ambil layanan
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local CollectionService = game:GetService("CollectionService")
local DataStoreService = game:GetService("DataStoreService")
-- Event remote untuk memperbarui UI
local uiEvent = ReplicatedStorage:WaitForChild("UIEvent")
-- Penyimpanan data untuk menyimpan potongan emas pemain
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Penyimpanan data terurut untuk menyimpan emas ke papan peringkat
local leaderboardStore = DataStoreService:GetOrderedDataStore("GlobalLeaderboard")
-- Buat generator angka acak untuk memposisikan potongan emas
local random = Random.new()
-- Tabel untuk menyimpan potongan emas pemain untuk satu sesi
local playerGold = {}
-- Konstanta
local GOLD_VALUE = 10 -- Berapa nilai masing-masing potongan emas
local GOLD_REGENERATION_BOUNDS = { -- Batas area yang digunakan untuk memposisikan ulang potongan emas secara acak
minX = -72,
maxX = 72,
minZ = -72,
maxZ = 72
}
local GOLD_REGEN_DELAY = 2 -- Penundaan sebelum potongan muncul kembali (dalam detik)
local AUTOSAVE_INTERVAL = 30 -- Seberapa sering potongan emas pemain disimpan (dalam detik)
-- Fungsi untuk menangani pemain mengumpulkan potongan emas
local function processGoldTouch(chunk, player)
-- Sembunyikan potongan saat pemain mengumpulkannya
chunk.Parent = nil
-- Tambahkan potongan ke skor emas sesi pemain
local userId = player.UserId
playerGold[userId] = (playerGold[userId] or 0) + GOLD_VALUE
print(player.Name, "sekarang memiliki", playerGold[userId], "emas")
-- Perbarui bilah skor UI untuk mencerminkan skor emas baru untuk sesi ini
uiEvent:FireClient(player, {
gold = playerGold[userId],
doTween = true,
showAlert = false
})
-- Tunggu sedikit dan kemudian muncul kembali potongan emas yang baru saja dikumpulkan di lokasi acak
task.delay(GOLD_REGEN_DELAY, function()
-- Munculkan kembali potongan emas di posisi baru yang acak
local nextPositionX = random:NextInteger(GOLD_REGENERATION_BOUNDS.minX, GOLD_REGENERATION_BOUNDS.maxX)
local nextPositionZ = random:NextInteger(GOLD_REGENERATION_BOUNDS.minZ, GOLD_REGENERATION_BOUNDS.maxZ)
chunk.CFrame = CFrame.new(nextPositionX, 50, nextPositionZ) -- Pindahkan potongan ke posisi baru
chunk:SetAttribute("DropCollided", false) -- Reset tanda-tanda benturan
chunk.Parent = workspace.GoldChunks
end)
end
-- Loop melalui semua bagian yang ditandai dengan "Gold" dan menghubungkannya ke deteksi sentuhan
for _, chunk in ipairs(CollectionService:GetTagged("Gold")) do
chunk.Touched:Connect(function(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player then
processGoldTouch(chunk, player)
end
end)
end
-- Fungsi untuk menyimpan emas pemain ke penyimpanan data standar dan terurut
local function saveGold(player, value)
local userId = player.UserId
local success, err = pcall(function()
goldStore:SetAsync(userId, value)
leaderboardStore:SetAsync(tostring(userId), value)
end)
if not success then
warn("Tidak dapat menyimpan emas untuk", player.Name, ":", err)
end
end
-- Fungsi untuk menangani pemain bergabung ke permainan
local function onPlayerAdded(player)
local userId = player.UserId
print(player.Name, "telah bergabung ke permainan")
-- Coba untuk memuat emas pemain dari penyimpanan data
local success, storedGold = pcall(function()
return goldStore:GetAsync(userId)
end)
-- Set skor emas sesi saat ini menggunakan nilai penyimpanan data untuk pemain
local currentGold = if success and storedGold then storedGold else 0
playerGold[userId] = currentGold
-- Perbarui UI dengan nilai penyimpanan data untuk pemain
uiEvent:FireClient(player, {
gold = currentGold,
doTween = false,
showAlert = not success
})
if success then
print("Dimuat", currentGold, "emas untuk", player.Name)
else
-- Beri tahu pemain bahwa emas mereka tidak dapat dimuat
uiEvent:FireClient(player, { showAlert = true })
warn("Tidak dapat memuat emas untuk", player.Name)
end
-- Mulai coroutine autosave untuk menyimpan emas pemain setiap 30 detik
coroutine.wrap(function()
while player.Parent do
task.wait(AUTOSAVE_INTERVAL)
if playerGold[userId] then
saveGold(player, playerGold[userId])
print("Penyimpanan otomatis", playerGold[userId], "emas untuk", player.Name)
end
end
end)()
end
-- Fungsi untuk menangani pemain meninggalkan permainan
local function onPlayerRemoving(player)
local userId = player.UserId
print(player.Name, "telah meninggalkan permainan")
-- Periksa apakah emas pemain dilacak
if playerGold[userId] then
-- Simpan emas pemain ke penyimpanan data sebelum mereka pergi
saveGold(player, playerGold[userId])
end
end
-- Hubungkan event bergabung dan meninggalkan pemain
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)

LeaderboardManager

Skrip modul LeaderboardManager:

  • Memanggil GetSortedAsync() di penyimpanan data terurut GlobalLeaderboard.
  • Mengonversi userIds menjadi nama pengguna menggunakan GetNameFromUserIdAsync.
  • Mengembalikan daftar tabel { Username, Score } untuk pemain yang memiliki peringkat tertinggi.
  • Dipanggil oleh LeaderboardRemoteHandler setiap kali klien meminta data papan peringkat.

-- Ambil layanan
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
-- Penyimpanan data terurut untuk menyimpan skor papan peringkat
local leaderboardStore = DataStoreService:GetOrderedDataStore("GlobalLeaderboard")
-- Tabel untuk menyimpan skor papan peringkat
local leaderboardManager = {}
-- Fungsi untuk mengembalikan skor tertinggi
function leaderboardManager.GetTopScores(limit)
-- Coba untuk mengambil halaman hasil papan peringkat yang terurut dari penyimpanan data
local success, pages = pcall(function()
-- false = menurun (skor tertinggi terlebih dahulu)
return leaderboardStore:GetSortedAsync(false, limit)
end)
-- Jika panggilan gagal atau tidak mengembalikan apapun, log peringatan dan kembalikan tabel kosong
if not success or not pages then
warn("Gagal mendapatkan data papan peringkat")
return {}
end
-- Buat tabel untuk menyimpan data pemain teratas
local topPlayers = {}
-- Loop melalui setiap entri di halaman hasil papan peringkat saat ini
for _, entry in ipairs(pages:GetCurrentPage()) do
local userId = tonumber(entry.key) -- Konversi kunci entri ke angka (userId disimpan sebagai string)
local score = entry.value -- Nilai adalah skor pemain (jumlah emas)
local username = "Unknown" -- Nama default jika pencarian gagal
-- Coba untuk mendapatkan nama pengguna pemain dari userId mereka
local ok, name = pcall(function()
return Players:GetNameFromUserIdAsync(userId)
end)
-- Jika pencarian berhasil, simpan nama pengguna asli
if ok then
username = name
end
-- Tambahkan pemain ini dan skor mereka ke dalam daftar
table.insert(topPlayers, {
Username = username,
Score = score
})
end
-- Kembalikan daftar penuh pemain teratas dengan nama pengguna dan skor mereka
return topPlayers
end
-- Kembalikan modul LeaderboardManager sehingga skrip lain dapat menggunakannya
return leaderboardManager

LeaderboardRemoteHandler

Skrip LeaderboardRemoteHandler mengambil dan mengembalikan 3 skor tertinggi kepada klien yang memanggil.


-- Ambil layanan
local ServerScriptService = game:GetService("ServerScriptService") -- Akses modul sisi server
local ReplicatedStorage = game:GetService("ReplicatedStorage") -- Objek komunikasi klien-server bersama
-- Tunggu fungsi RemoteFunction yang digunakan klien untuk meminta data papan peringkat
local leaderboardRemote = ReplicatedStorage:WaitForChild("LeaderboardRemote")
-- Muat modul LeaderboardManager yang berisi fungsi GetTopScores
local leaderboardManager = require(ServerScriptService:WaitForChild("LeaderboardManager"))
-- Atur pengendali untuk saat klien mengaktifkan fungsi RemoteFunction papan peringkat
leaderboardRemote.OnServerInvoke = function(player)
-- Panggil modul papan peringkat untuk mendapatkan 3 skor tertinggi dan mengembalikannya ke klien
return leaderboardManager.GetTopScores(3)
end

LeaderboardGuiScript

Skrip lokal LeaderboardGuiScript:

  • Meminta data papan peringkat dari server setiap 3 detik menggunakan Class.RemoteHandler.InvokeServer|InvokeServer.
  • Menggunakan template LeaderboardEntry yang tersembunyi untuk menampilkan setiap baris papan peringkat.
  • Memformat setiap baris sebagai "1st place: Username - Score".
  • Mengelola pembuatan, tampilan, dan tata letak baris papan peringkat menggunakan UIListLayout.

-- Ambil penyimpanan bersama untuk akses RemoteFunction
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Ambil RemoteFunction yang digunakan untuk meminta data papan peringkat dari server
local leaderboardRemote = ReplicatedStorage:WaitForChild("LeaderboardRemote")
-- Referensi UI
local gui = script.Parent -- Skrip Lokal di bawah ScreenGui
local leaderboardFrame = gui:WaitForChild("LeaderboardFrame") -- Kontainer utama untuk papan peringkat
local entriesFrame = leaderboardFrame:WaitForChild("EntriesFrame") -- Frame di mana entri papan peringkat muncul
local template = entriesFrame:WaitForChild("LeaderboardEntry") -- Template TextLabel tersembunyi yang digunakan untuk membuat baris
-- Fungsi untuk menghapus baris papan peringkat lama (tetapi tidak template)
local function clearEntries()
for _, child in ipairs(entriesFrame:GetChildren()) do
-- Hanya hancurkan label yang bernama "Row1", "Row2", dll (biarkan template tidak tersentuh)
if child:IsA("TextLabel") and child.Name:match("^Row%d+$") then
child:Destroy()
end
end
end
-- Fungsi untuk menampilkan data papan peringkat di layar
local function renderLeaderboard(data)
-- Hapus baris lama terlebih dahulu
clearEntries()
for i, entry in ipairs(data) do
local row = template:Clone() -- Kloning template tersembunyi
row.Name = "Row" .. i -- Beri nama unik
row.Visible = true -- Jadikan terlihat
row.LayoutOrder = i -- Biarkan UIListLayout mengatur dengan benar
-- Format papan peringkat: "1st place: Username - 123"
row.Text = string.format("%d%s tempat: %s - %d",
i,
i == 1 and "st" or i == 2 and "nd" or i == 3 and "rd" or "th",
entry.Username,
entry.Score
)
-- Tambahkan data ke UI
row.Parent = entriesFrame
end
end
-- Loop utama: memperbarui papan peringkat setiap 3 detik
while true do
-- Tanyakan server untuk data papan peringkat
local success, data = pcall(function()
return leaderboardRemote:InvokeServer()
end)
if success and data then
-- Tampilkan hasil di papan peringkat
renderLeaderboard(data)
else
warn("Gagal mengambil data papan peringkat")
end
-- Tunggu 3 detik sebelum memperbarui lagi
task.wait(3)
end
©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.