Orta seviye öğreticiler

Sıralı Veri Mağazaları ile Özel Bir Liderlik Tablosu Oluşturun

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Veri mağazaları, farklı oyuncu oturumları arasında kalıcı oyuncu verilerini kaydetmek ve yüklemek için kullanabileceğiniz bir hizmettir. Bir oyuncunun ilerlemesi veya envanteri gibi önemli bilgileri saklar ve oyuncu oyuna tekrar katıldığında bu bilgileri geri almanızı sağlar. Veri mağazaları olmadan, bir oyuncu oyundan her ayrıldığında tüm ilerlemesini kaybeder.

İki tür veri mağazası vardır: standart ve sıralı. Bu eğitimde sıralı veri mağazaları kullanılır; bu mağazalar, verileri sıralayıp sayısal olarak sıralamanızı sağlar ve saklanan sayısal değerlere göre artan veya azalan sırada almanıza olanak tanır.

Altın Koşusu liderlik tablosu oluşturma eğitimini - Başlangıç .rbxl dosyasını başlangıç noktası olarak kullanarak ve Altın Koşusu liderlik tablosu oluşturma eğitimini - Tamamlandı .rbxl dosyasını referans olarak alarak, bu eğitim size özel bir oyuncu liderlik tablosu oluşturmanız için gereken temeli sağlar; bu, aşağıdakileri içerir:

  • Altın puanlarını sıralı veri mağazasında saklamak.
  • En yüksek puanları tüm sunucular genelinde almak ve sıralamak.
  • En yüksek puanları özel bir liderlik tablosunda kullanıcı arayüzünde görüntülemek.
  • Özel liderlik tablosunu her birkaç saniyede bir otomatik olarak yenilemek.

Bu eğitim sonunda aşağıdakilere sahip olmalısınız:

  1. ServerScriptService altında:
    1. Oyuncunun puanını liderlik tablosu için sıralı veri mağazasına kaydeden güncellenmiş GoldManager betiği.
    2. Liderlik tablosundan en yüksek puanların sıralı listesini alıp döndüren yeni bir LeaderboardRemoteHandler modül betiği.
    3. İstemciden liderlik tablosu veri taleplerine yanıt veren yeni bir LeaderboardManager betiği; bu betik, LeaderboardGuiScript içindeki istemci ile LeaderboardManager içindeki sunucu arasında bir köprü görevi görür.
  2. StarterGui altında, oyuncular için liderlik tablosu kullanıcı arayüzünü render eden yeni bir LeaderboardGuiScript yerel betiği.

Studio'nun API hizmetlerine erişimini etkinleştirin

Veri mağazaları cihazınızda yerel olarak saklanmadığından, oyununuz bu hizmetleri kullanmak için Roblox'un arka uç sunucularıyla sunucu-arası iletişime dayanır. Varsayılan olarak, Studio bu iletişimi suistimal edilmesini veya kazara kullanımını önlemek için kısıtlar. Studio'daki API hizmetlerine erişim, sadece güvendiğiniz oyunların Roblox'un arka uç sunucularından verileri okuyup yazabilmesi için açıkça etkinleştirilene kadar devre dışıdır.

Studio'nun API hizmetlerine erişimini etkinleştirmek için:

  1. Studio'da Altın Koşusu liderlik tablosu oluşturma eğitimini - Başlangıç dosyasını açın. Bu başlangıç dosyası, Oyuncu verilerini kaydetme tutorialini ve oyuncu liderlik tablosu için kullanıcı arayüzü iskeletini zaten içermektedir.
  2. Oyununuzu yayınlayın.
  3. Studio'da DosyaDeneyim AyarlarıGüvenlik sekmesine gidin.
  4. API Hizmetlerine Studio Erişimini Etkinleştir seçeneğini açın.
  5. Değişikliklerinizi kaydedin.

Sıralı bir veri mağazası oluşturun

Bir veri mağazası oluştururken, her zaman bir sunucu tarafı Script'ten DataStoreService çağrısı yapmalısınız. Bunun önemli olmasının nedenleri:

  • Roblox, yalnızca sunucunun kalıcı oyuncu verilerine erişim ve değiştirme iznine sahip olabilmesi için istemciden veri mağazası erişimini engeller.
  • Sunucu tarafı betikleri, okunan ve yazılan verilerin doğru ve geçerli olmasını sağlamak için merkezi bir ortamda çalışır.
  • İstemci tarafı betikleri oyuncunun cihazında çalıştığı için, herhangi bir oyuncu oyunu istismar edebilir ve diğer oyuncuların verilerini çalabilir veya değiştirebilir.

Ayrıca, verilerinizi düzenli tutmak ve farklı veri mağazalarında çakışmalarını veya örtüşmelerini önlemek için veri mağazanıza benzersiz bir ad vermelisiniz. Bu eğitimde liderlik tablosu için veri mağazasının adı GlobalLeaderboard olarak belirlenmiştir.

GlobalLeaderboard sıralı veri mağazasını oluşturmak için:

  1. ServerScriptService altında mevcut GoldManager betiğini açın.

  2. Mevcut PlayerGold veri mağazasının altına GetOrderedDataStore ile "GlobalLeaderboard" dizesini çağırın. Bu, oyuncunun altın kazandığında puanını kaydetmek için bir sıralı veri mağazası oluşturur.


    local leaderboardStore = DataStoreService:GetOrderedDataStore("GlobalLeaderboard")

Bir veri mağazası oluşturduktan sonra, bu veri mağazasını farklı betikler arasında referans alabiliyorsunuz. Örneğin, daha sonra bu eğitimde oluşturmayı planladığınız LeaderboardManager modül betiği ve GoldManager betiğinde GetOrderedDataStore çağrısı yapabilirsiniz. Aynı veri mağazasını iki yerde referans almak, verilerinizi kopyaladığınız anlamına gelmez; sadece iki betiğin merkezi depolamayı eriştiği anlamına gelir; bu, iki takım arkadaşının bilgi paylaşmak için tek bir klasör kullanmasına benzer.

Oyuncu verilerini liderlik tablosuna gönderin

Veri mağazaları, verileri tanımlayan anahtarlar ve verileri saklayan değerlerden oluşur. Standart veri mağazalarının aksine, sıralı veri mağazaları verileri değer ile sıralama olanağı sağlar; bu, liderlik tabloları gibi şeyler oluşturmak için onları ideal hale getirir.

Bir sıralı veri mağazasında her bir giriş, sayısal olarak sıralayabileceğiniz ve saklanan sayısal değerlere dayalı olarak artan veya azalan sırayla alabileceğiniz eşsiz bir anahtar altında saklanır. Bu, sıralı veri mağazalarını kullanarak, örneğin, oyununuzdaki oyuncular altın topladıkça gerçek zamanlı olarak güncellenen bir ilk 3 listesini göstermenize olanak tanır.

AnahtarDeğer
TanımBir anahtar, belirli bir veri parçasına erişmek için kullanabileceğiniz benzersiz bir dize kimliğidir, bir oyuncunun kullanıcı kimliği gibi.

Anahtarlar, verilerinizi düzenlemenize ve kolayca yönetmenize ve hata ayıklamanıza olanak tanır.
Bir değer, kaydetmek veya yüklemek istediğiniz gerçek sayısal veridir; bir oyuncunun puanı gibi.

Değerler, oturumlar arasında ilerlemeyi saklamanıza ve oyuncu verilerini bir sonraki oyuna katıldıklarında geri almanıza olanak tanır.
İzin Verilen formatlarSadece dizgeler olabilir. Bir kullanıcı kimliği gibi sayılar kullanıyorsanız, tostring() ile bir dizeye dönüştürün.Sadece sayılar olabilir.
Örnekler"Player_A", "TopScore", "123456" (kullanıcı kimliği dize olarak)100, 3.14, 0, -25

Artık GlobalLeaderboard sıralı veri mağazanızı oluşturduğunuza göre, GoldManager betiğindeki mevcut saveGold fonksiyonunu güncelleyerek oyuncunun altın puanını özel liderlik tablonuza SetAsync ile gönderin:


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("Altın kaydedilemedi", player.Name, ":", err)
end
end

Sıralı veri mağazasını GlobalLeaderboard ortak bir klasör gibi düşünebilirsiniz: SetAsync, klasöre içerik ekler; bunun yanında GetSortedAsync (daha sonra LeaderboardManager modül betiğinde oluşturacağınız) klasörün içeriğini okur ve puana göre sıralar.

Liderlik tablosu puanlarını al

Liderlik tablosu puanlarını almak için, bir ModuleScript kullanmalısınız. Modül betikleri, kodunuzu birden fazla betik arasında düzenlemenize ve yeniden kullanmanıza olanak tanır. Aynı mantığı farklı yerlere kopyalamak yerine, bir modül betiğinde bir kez yazabilir ve ihtiyaç duyulan her yerden çağırabilirsiniz.

Liderlik tablosu mantığınızı bir modülde sakladığınızda, hem kullanıcı arayüzü işleyicisi hem de sunucu betikleri, en yüksek oyuncu puanlarını almak için aynı fonksiyonu kullanabilir. Kullanıcı adlarının nasıl alındığını veya puanların nasıl sıralandığını güncellemeniz gerektiğinde, sadece bir yerdeki kodu değiştirmeniz yeterlidir. Modülü güncellediğinizde, onu kullanan tüm betikler otomatik olarak güncellenmiş davranışı alır.

Özelleştirilmiş liderlik tablonuz, farklı sunucular arasında veri paylaşmak için aşağıdaki sıralı veri mağazası yöntemlerini kullanır:

  • Oyuncu puanlarını GlobalLeaderboard sıralı veri mağazasına gönderen SetAsync (GoldManager betiğinden).
  • GetSortedAsync (modül betiğinde) ile aynı veri mağazasından tüm sunuculardan en yüksek puanları almak için. GetSortedAsync yöntemi, sıralı veri mağazaları için özeldir ve belirli bir sıralama düzenine, sayfa boyutuna ve minimum ve maksimum değerlere göre birden fazla sıralı anahtar alabilir.

Liderlik tablosu puanlarını almak için:

  1. ServerScriptService altında yeni bir ModuleScript oluşturun ve adını LeaderboardManager koyun.

  2. Modül betiğinin en üstünde, GetOrderedDataStore ile "GlobalLeaderboard" dizesini çağırın. GoldManager betiğinde oluşturduğunuz aynı sıralı veri mağazasını referans almak, daha sonra liderlik tablosu kullanıcı arayüzünün en yüksek oyuncu puanlarını alabilmesini ve sıralayabilmesini sağlayacaktır.


    local DataStoreService = game:GetService("DataStoreService")
    local Players = game:GetService("Players")
    local leaderboardStore = DataStoreService:GetOrderedDataStore("GlobalLeaderboard")
  3. Diğer betiklere açmak istediğiniz tüm fonksiyonlar ve verileri saklayacak bir modül tablosu hazırlayın.


    local leaderboardManager = {}
  4. En yüksek oyuncu puanlarını almak için GetTopScores adında bir fonksiyon oluşturun. Bu fonksiyon:

    • GetSortedAsync çağrısı yaparak azalan sırada limit sayıda en yüksek puanı alır. Eğer çağrı başarısız olursa, kodunuzun çökmesini önlemek için boş bir liste döner.
    • Liderlik tablosunu inceleyerek GetCurrentPage ile girişlerin bir tablosunu ve GetNameFromUserIdAsync ile oyuncu kullanıcı adlarını alır.
    • Her sonu son listeye ekler ve oyuncu kullanıcı adları ve puanları ile birlikte bir liderlik tablosu oluşturur.
    • Son oyuncu listesini döndürür ve liderlik tablosu verilerini bu leaderboardManager.GetTopScores fonksiyonunu çağıran herhangi bir betiğe geri gönderir.

    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 = "Bilinmiyor"
    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. Modülü kullanılabilir hale getirmek için daha önce oluşturduğunuz modül tablosunu döndürün. Herhangi bir modül betiği oluşturduğunuzda, diğer betiklerin ona erişebilmesi ve içindeki fonksiyonları çağırabilmesi için modül tablosunu döndürmelisiniz.


    return leaderboardManager

Sunucudan liderlik tablosu verilerini talep et

İstemci kullanıcı arayüzünün liderlik tablosu puanlarını gösterebilmesi için, istemcinin veri talep ettiğinde sunucunun yanıt vermesi gerekir. Bir RemoteFunction, istemcinin sunucudan bilgi talep etmesine ve bir yanıt beklemesine olanak tanır.

Sunucudan liderlik tablosu verilerini talep etmek için:

  1. ReplicatedStorage altında LeaderboardRemote adında bir RemoteFunction ekleyin. Bu uzaktan işlev, istemcideki kullanıcı arayüzü betiği ile sunucudaki liderlik tablosu mantığı arasındaki köprü gibi çalışır.
  2. ServerScriptService altında LeaderboardRemoteHandler adında bir betik oluşturun. Bu betikte:
    1. İstemci ile sunucu arasındaki ortak alan olan ReplicatedStorage, liderlik modülünü bulunduran ServerScriptService ve istemcinin liderlik tablosu verilerini talep etmek için çağıracağı uzaktan işlemi leaderboardRemote çağırın.


      local ReplicatedStorage = game:GetService("ReplicatedStorage")
      local ServerScriptService = game:GetService("ServerScriptService")
      local leaderboardRemote = ReplicatedStorage:WaitForChild("LeaderboardRemote")
    2. Daha önce oluşturduğunuz ve sıralı veri mağazasından en yüksek puanları alan fonksiyonu içeren LeaderboardManager modülünü yükleyin.


      local leaderboardManager = require(ServerScriptService:WaitForChild("LeaderboardManager"))
    3. İstemci InvokeServer çağrısı yaptığında ne olacağını belirleyin. Sunucu, en yüksek 3 puanı alıp sonucu istemciye geri gönderir.


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

Özel liderlik tablosu kullanıcı arayüzünde verileri görüntüle

Sunucu tarafı betiklerini kurduktan sonra, her 3 saniyede bir en yüksek 3 oyuncuyu almak ve sonuçları oyundaki bir küresel kullanıcı arayüzü liderlik tablosunda görüntülemek için bir yerel betik oluşturun.

Özel liderlik tablonuzda verileri görüntülemek için:

  1. StarterGuiLeaderboardGui altında LeaderboardGuiScript adında bir yerel betik oluşturun.

  2. Betiğin en üstünde, uzaktan işlevle bağlantı kurun. Sunucu ve istemci arasında paylaşılan nesnelere erişmek için ReplicatedStorage çağırın ve ardından istemcinin sunucudan liderlik tablosu verilerini talep etmesine olanak tanımak için leaderboardRemote çağırın.


    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local leaderboardRemote = ReplicatedStorage:WaitForChild("LeaderboardRemote")
  3. LeaderboardGui altındaki mevcut liderlik tablosu kullanıcı arayüzü öğelerini referans alın.


    local gui = script.Parent
    local leaderboardFrame = gui:WaitForChild("LeaderboardFrame")
    local entriesFrame = leaderboardFrame:WaitForChild("EntriesFrame")
    local template = entriesFrame:WaitForChild("LeaderboardEntry")
  4. Eski liderlik tablosu girişlerini temizleyecek clearEntries adında bir fonksiyon oluşturun. Bu fonksiyon, liderlik tablosu satırlarını içeren entriesFrame'in tüm çocuklarının arasında döngü yapar ve yeni verileri görüntülemeden önce liderlik tablosunun tamamen yenilendiğinden emin olur.


    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. Liderlik tablosu satırlarında oyuncu verilerini ekleyip görüntülemek için renderLeaderboard adında bir fonksiyon oluşturun. data nesnesi, sunucudan dönen ve oyuncu kullanıcı adları ile puanları içeren bir tablodur.


    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 sırada: %s - %d",
    i, i == 1 and "inci" or i == 2 and "nci" or i == 3 and "üncü" or "nci",
    entry.Username, entry.Score)
    row.Parent = entriesFrame
    end
    end
  6. Liderlik tablosu verilerini belirli aralıklarla almak için bir döngü oluşturun. Her 3 saniyede bir döngü çalışır ve daha önce LeaderboardRemoteHandler betiğinde oluşturduğunuz InvokeServer fonksiyonunu kullanarak sunucuyu arar. Eğer çağrı başarılı olursa, kullanıcı arayüzü güncellenmiş puanlarla yenilenir.


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

Tam kod

Aşağıdaki kod parçacıklarını GoldManager, LeaderboardManager, LeaderboardRemoteHandler ve LeaderboardGuiScript betikleri için tamamlayıcı hale getirin. Bunları Studio'daki Altın Koşusu liderlik tablosu oluşturma eğitimini - Başlangıç .rbxl dosyasına doğrudan yapıştırıp çalıştırabilirsiniz.

GoldManager

GoldManager betiği, liderlik tablosu güncellemelerini yönetmek için bir sıralı veri mağazası oluşturur.


-- Hizmetleri al
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local CollectionService = game:GetService("CollectionService")
local DataStoreService = game:GetService("DataStoreService")
-- UI'yi güncellemek için uzak olayı
local uiEvent = ReplicatedStorage:WaitForChild("UIEvent")
-- Oyuncunun altın parçalarını kaydetmek için veri mağazası
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Liderlik tablosuna altın kaydetmek için sıralı veri mağazası
local leaderboardStore = DataStoreService:GetOrderedDataStore("GlobalLeaderboard")
-- Altın parçalarının konumlandırılması için rastgele bir sayı üreteci oluştur
local random = Random.new()
-- Tek bir oturum için oyuncunun altın parçalarını depolamak için tablo
local playerGold = {}
-- Sabitler
local GOLD_VALUE = 10 -- Her altın parçasının değeri
local GOLD_REGENERATION_BOUNDS = { -- Altın parçalarının rastgele yeniden konumlandırılması için alan sınırları
minX = -72,
maxX = 72,
minZ = -72,
maxZ = 72
}
local GOLD_REGEN_DELAY = 2 -- Bir parçanın yeniden doğması için gecikme (saniye cinsinden)
local AUTOSAVE_INTERVAL = 30 -- Oyuncunun parçalarının kaydedilme sıklığı (saniye cinsinden)
-- Oyuncunun bir altın parçasını toplamasını işleyen fonksiyon
local function processGoldTouch(chunk, player)
-- Oyuncu parçayı topladığında parçayı gizle
chunk.Parent = nil
-- Oyuncunun oturum altın puanını parçayı toplarken ekle
local userId = player.UserId
playerGold[userId] = (playerGold[userId] or 0) + GOLD_VALUE
print(player.Name, "şu anda", playerGold[userId], "altına sahip")
-- Bu oturum için yeni altın puanını yansıtacak şekilde UI puan çubuğunu güncelle
uiEvent:FireClient(player, {
gold = playerGold[userId],
doTween = true,
showAlert = false
})
-- Biraz bekleyin ve ardından şimdi toplanmış olan altın parçasını rastgele bir konumda yeniden doğurun
task.delay(GOLD_REGEN_DELAY, function()
-- Altın parçasını yeni rastgele bir konumda yeniden doğurun
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) -- Parçayı yeni konuma taşı
chunk:SetAttribute("DropCollided", false) -- Herhangi bir çarpışma bayraklarını sıfırla
chunk.Parent = workspace.GoldChunks
end)
end
-- "Altın" etiketi ile işaretlenmiş tüm parçaları döngüye al ve dokunma algısına bağla
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
-- Oyuncunun altınını hem standart hem de sıralı veri mağazalarına kaydetme fonksiyonu
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("Altın kaydedilemedi", player.Name, ":", err)
end
end
-- Oyuncunun oyuna katılmasını işleyen fonksiyon
local function onPlayerAdded(player)
local userId = player.UserId
print(player.Name, "oyuna katıldı")
-- Oyuncunun veri mağazasından altınını yüklemeye çalışın
local success, storedGold = pcall(function()
return goldStore:GetAsync(userId)
end)
-- Veri mağazası değeri ile oyuncunun güncel oturum altın puanını ayarlayın
local currentGold = if success and storedGold then storedGold else 0
playerGold[userId] = currentGold
-- Oyuncu için veri mağazası değerini UI ile güncelleyin
uiEvent:FireClient(player, {
gold = currentGold,
doTween = false,
showAlert = not success
})
if success then
print("Yüklendi", currentGold, "altın", player.Name, "için")
else
-- Oyuncuyu altınlarının yüklenemediği konusunda bilgilendirin
uiEvent:FireClient(player, { showAlert = true })
warn("Yüklenemedi altın", player.Name)
end
-- Oyuncunun altınını her 30 saniyede bir kaydetmek için otomatik kaydetme coroutine'ini başlat
coroutine.wrap(function()
while player.Parent do
task.wait(AUTOSAVE_INTERVAL)
if playerGold[userId] then
saveGold(player, playerGold[userId])
print("Otomatik kaydediliyor", playerGold[userId], "altın", player.Name)
end
end
end)()
end
-- Oyuncunun oyundan ayrılmasını işleyen fonksiyon
local function onPlayerRemoving(player)
local userId = player.UserId
print(player.Name, "oyundan ayrıldı")
-- Oyuncunun altınının takip edilip edilmediğini kontrol edin
if playerGold[userId] then
-- Oyuncunun ayrılmadan önce altınını veri mağazasına kaydedin
saveGold(player, playerGold[userId])
end
end
-- Oyuncunun katılması ve ayrılması olaylarını bağlayın
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)

LeaderboardManager

LeaderboardManager modül betiği:

  • GlobalLeaderboard sıralı veri mağazasındaki GetSortedAsync() çağrısını yapar.
  • Kullanıcı kimliklerini GetNameFromUserIdAsync ile kullanıcı adlarına dönüştürür.
  • En yüksek sıralı oyuncular için { Username, Score } tablolarının bir listesini döndürür.
  • İstemci, liderlik tablosu verisini talep ettiğinde LeaderboardRemoteHandler tarafından çağrılır.

-- Hizmetleri al
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
-- Liderlik tablosu puanlarını kaydetmek için sıralı veri mağazası
local leaderboardStore = DataStoreService:GetOrderedDataStore("GlobalLeaderboard")
-- Liderlik tablosu puanlarını saklamak için tablo
local leaderboardManager = {}
-- En yüksek puanları döndürmek için fonksiyon
function leaderboardManager.GetTopScores(limit)
-- Veri mağazasından sıralı liderlik girişlerinin bir sayfasını almaya çalışın
local success, pages = pcall(function()
-- false = azalan (en yüksek puanlar önce gelir)
return leaderboardStore:GetSortedAsync(false, limit)
end)
-- Eğer çağrı başarısız olursa veya hiç sonuç dönmezse, bir uyarı kaydedin ve boş bir tablo döndürün
if not success or not pages then
warn("Liderlik tablosu verileri alınamadı")
return {}
end
-- En yüksek oyuncu verilerini saklayacak bir tablo oluşturun
local topPlayers = {}
-- Liderlik tablosu sonuçlarının mevcut sayfasındaki her giriş arasında döngü yapın
for _, entry in ipairs(pages:GetCurrentPage()) do
local userId = tonumber(entry.key) -- Giriş anahtarını bir sayıya dönüştürün (kullanıcı ID'si dize olarak saklandı)
local score = entry.value -- Değer, oyuncunun puanı (altın miktarı)
local username = "Bilinmiyor" -- Varsayılan isim, lookup başarısız olursa
-- Oyuncunun kullanıcı adını kullanıcı ID'sinden almaya çalışın
local ok, name = pcall(function()
return Players:GetNameFromUserIdAsync(userId)
end)
-- Eğer lookup başarırsa, gerçek kullanıcı adını saklayın
if ok then
username = name
end
-- Bu oyuncuyu ve puanını listeye ekleyin
table.insert(topPlayers, {
Username = username,
Score = score
})
end
-- Kullanıcı adları ve puanları ile birlikte en üst oyuncu listesini döndürün
return topPlayers
end
-- Diğer betiklerin kullanabilmesi için LeaderboardManager modülünü döndür
return leaderboardManager

LeaderboardRemoteHandler

LeaderboardRemoteHandler betiği, istemciye en yüksek 3 puanı alır ve geri döndürür.


-- Hizmetleri al
local ServerScriptService = game:GetService("ServerScriptService") -- Sunucu tarafı modüllerine erişim
local ReplicatedStorage = game:GetService("ReplicatedStorage") -- İstemci-sunucu iletişimi için paylaşılan nesneler
-- İstemcinin liderlik tablosu verilerini talep etmek için kullandığı RemoteFunction'ı bekleyin
local leaderboardRemote = ReplicatedStorage:WaitForChild("LeaderboardRemote")
-- En yüksek puanları alacak olan LeaderboardManager modülünü yükleyin
local leaderboardManager = require(ServerScriptService:WaitForChild("LeaderboardManager"))
-- İstemci liderlik tablosu RemoteFunction'ı çağırdığında ne olacağını ayarlayın
leaderboardRemote.OnServerInvoke = function(player)
-- En yüksek 3 puanı almak için liderlik modülünü çağırın ve bunları istemciye geri gönderin
return leaderboardManager.GetTopScores(3)
end

LeaderboardGuiScript

LeaderboardGuiScript yerel betiği:

  • Sunucudan liderlik tablosu verilerini her 3 saniyede bir Class.RemoteHandler.InvokeServer|InvokeServer kullanarak alır.
  • Her liderlik tablosu satırını görüntülemek için gizli bir LeaderboardEntry şablonunu kullanır.
  • Her satırı "1. sırada: Kullanıcı Adı - Puan" biçiminde formatlar.
  • UIListLayout kullanarak liderlik tablosu satırlarının oluşturulmasını, görüntülenmesini ve düzenlenmesini yönetir.

-- Uzak işlev erişimi için paylaşılan depoyu al
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Sunucudan liderlik tablosu verilerini talep etmek için kullanılan RemoteFunction'ı al
local leaderboardRemote = ReplicatedStorage:WaitForChild("LeaderboardRemote")
-- UI referansları
local gui = script.Parent -- ScreenGui altında yerel betik
local leaderboardFrame = gui:WaitForChild("LeaderboardFrame") -- Liderlik tablosu için ana container
local entriesFrame = leaderboardFrame:WaitForChild("EntriesFrame") -- Liderlik tablosu girişlerinin göründüğü çerçeve
local template = entriesFrame:WaitForChild("LeaderboardEntry") -- Satırları oluşturmak için kullanılan gizli şablon TextLabel
-- Eski liderlik tablosu satırlarını temizleme fonksiyonu (şablonu hariç tutar)
local function clearEntries()
for _, child in ipairs(entriesFrame:GetChildren()) do
-- Sadece "Row1", "Row2" gibi adlarla adlandırılmış etiketleri yok edin (şablonu olduğu gibi bırakın)
if child:IsA("TextLabel") and child.Name:match("^Row%d+$") then
child:Destroy()
end
end
end
-- Liderlik tablosu verilerini ekranda görüntüleyen fonksiyon
local function renderLeaderboard(data)
-- Önce eski satırları temizleyin
clearEntries()
for i, entry in ipairs(data) do
local row = template:Clone() -- Gizli şablonu klonlayın
row.Name = "Row" .. i -- Ona benzersiz bir ad verin
row.Visible = true -- Görünür hale getirin
row.LayoutOrder = i -- UIListLayout'ın düzgün sıralamasını sağlamasına izin verin
-- Liderlik tablosu formatı: "1. sırada: Kullanıcı Adı - 123"
row.Text = string.format("%d%s sırada: %s - %d",
i,
i == 1 and "inci" or i == 2 and "nci" or i == 3 and "üncü" or "nci",
entry.Username,
entry.Score
)
-- Verileri UI'ya ekleyin
row.Parent = entriesFrame
end
end
-- Ana döngü: liderlik tablosunu her 3 saniyede bir güncelle
while true do
-- Sunucudan liderlik tablosu verilerini ister
local success, data = pcall(function()
return leaderboardRemote:InvokeServer()
end)
if success and data then
-- Sonuçları liderlik tablosunda göster
renderLeaderboard(data)
else
warn("Liderlik tablosu verileri alınamadı")
end
-- Tekrar güncellenmeden önce 3 saniye bekleyin
task.wait(3)
end
©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.