Oyuncu Verilerini Kaydet ve Göster

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


Artık bir oyuncunun bir para topladığını tespit ettiğinizde, bu bölüm öğreticiyi saymak için oyuncuların topladığı para sayısını gösterir ve bu miktarı bir liderlik tablosugörünür hale getirir.

Para Koleksiyonunu Kaydetmek için Bir Modül Skripti Oluştur

Her oyuncunun para toplama verilerinin depolanmasını ve yönetimi için bir ModuleScript nesneyi oluşturmalısınız, böylece her oyuncu para toplama verilerine erişebilecek bir veri yapısı ve işlevleri içerebilir. Modül kodları, diğer kodların gerektiği yeniden kullan

Modül bir kod oluşturmak için:

  1. In the Explorer window, hover over ServerStorage and click the button. A context menu displays.

  2. Konteks menüsünden ModuleScript seçin. ServerStorage altında yeni bir modül scripti görüntülenir. Modül bir scriptini ServerStorage içine yerleştiriyorsunuz çünkü sunucudaki para koleksiyonu mantığını yönetmek istiyorsunuz.

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. Modül kısmını PlayerData olarak yeniden adlandırın.

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. Aşağıdaki kodu varsayılan kodla değiştirin:


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    local playerData = {
    --[[
    [userId: string] = {
    ["Coins"] = coinAmount: number
    }
    ]]
    }
    local DEFAULT_PLAYER_DATA = {
    [PlayerData.COIN_KEY_NAME] = 0
    }
    local function getData(player)
    local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATA
    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

    Modül kodu, bir oyuncu için para toplama verilerini temsil eden PlayerData tabelerini tanımlar, bunlar bir playerData tabelerinin içindeki sıfır veya birkaç PlayerData tabeleridir. Bu modül kodu gerektiren her kodun aynı kopyasını almasına izin verir, böylece birkaç kodun para toplama verilerini de

    Veri Struktürlerini Bildirme

    Modül kaynağı, PlayerData olarak başlar, bu da kaynağın sonunda iade edilir. Ayrıca kaynağın içinde değerleri alıp ayarlama yöntemleri bulunur.

    playerData tabelasında, kodu anlamak için kullanıcının yapısını açıklayan yorumlar bulunur, böylece kodu daha kolay anlayabilirsiniz. Bu durumda, bir playerData tabelasında, oyuncutopladığı para miktarını temsil eden bir userId tabelası ve a


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    local playerData = {
    --[[
    [userId: string] = {
    ["Coins"] = coinAmount: number
    }
    ]]
    }
    ...
    return PlayerData

    Yerel bir veri aksesörü tanımlanıyor

    getData() is a local function that retrieves data for a specific playerData table. If a player hasn't collected a coin, it returns a DEFAULT_PLAYER_DATA table to ensure that every player has some data associating with them. A common convention is to create simple, public-facing functions that offload logic to locally-scoped functions that do the heavy lifting.


    local DEFAULT_PLAYER_DATA = {
    [PlayerData.COIN_KEY_NAME] = 0
    }
    local function getData(player)
    local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end

    Herkese Açık Veri Erişiminizi Tanımlama

    getValue() ve updateValue() , bu modülün kullanımını gerektiren diğer yazılımların çağırabileceği kamu yüzü işlevleridir. Bizim durumumuzda, CoinService bu işlevleri kullanır ve bir oyuncu oyuncu oyunu yüzünden herhangi bir oyuncu oyunu oyunu güncellemez.


    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

Bir Lider Listesi Oluştur

Görsel bir liderlik tablosukullanarak paraları güzel bir şekilde temsil edebilirsiniz. Roblox, varsayılan bir UI kullanarak lider tablosunu otomatik olarak oluşturan bir yerleşik sistem içerir.

liderlik tablosutablosunu oluşturmak için:

  1. In the Explorer window, create a ModülScript in ServerStorage , then rename the module script to 1> LiderTablosu1> .

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. Aşağıdaki kodu varsayılan kodla değiştirin:


    local Leaderboard = {}
    -- Yeni bir liderlik tablosuoluşturulması
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- liderlik tablosu'u oluşturmak için Roblox tarafından kabul edilen yanlış bir isimdir
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Yeni bir lider tablosu değeri oluşturuluyor
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- Bir oyuncunun istatistik değerini güncelleme
    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

    Aşağıdaki bölümler, lider tablosunun nasıl daha ayrıntılı çalıştığını açıklar.

    Bir Lider Listesi Oluşturulması

    The setupLeaderboard() function creates a new folder instance named leaderstats and sets it as a child of the specified oyuncu. Roblox automatically recognizes a folder named leaderstats as a container of stats and


    -- Yeni bir liderlik tablosuoluşturulması
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- liderlik tablosu'u oluşturmak için Roblox tarafından kabul edilen yanlış bir isimdir
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Yeni bir lider tablosu değeri oluşturuluyor
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    Oyuncu İstatistiklerini Güncelliyor

    setStat() modülündeki tek halka açık işlevdir. Eğer mevcut değilse, belirli bir oyuncunun veya lider tablosu kendisi için stat değerleri oluşturur.

    FindFirstChild() bir objeğin adını alır ve mevcutsa obje için iade eder veya nil değilse. Bu, yüklenmeden önce bir obje'yi öğrenmenin yaygın, güvenli bir yöntemidir.


    -- Bir oyuncunun istatistik değerini güncelleme
    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

Modül Kodlarını Entegre Et

Her ikisi de PlayerData ve Leaderboard modülü scriptleri tamamlandığında, onları CoinService scriptinde yönetmek ve göstermek için gerektirir. Güncelleme 1>CoinService1> :

  1. In the Explorer window, open the CoinService script.

  2. Mevcut kodu aşağıdaki kodla değiştirin:


    -- Hizmetleri ve değişkenleri başlatıyor
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Modüller
    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)
    -- Para masasını güncelle
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
    -- Madeni para liderlik tablosunu güncelle
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    end
    -- Etkinliğin oluşturucusunu tanımlama
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Oyuncu bir para dokunuldu
    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
    -- Etkinlik dinleyicileri ayarlanıyor
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    Orijinal CoinService kriptinin değişiklikleri içerir:

    • PlayerData ile Leaderboard modülünü 1> 4>Global.LuaGlobals.gerek()4> işleviyle İçe aktarılır.
    • Bir oyuncu bir para topladığında eklenmesi gereken COIN_AMOUNT_TO_ADD sayısını tanımlar ve COIN_KEY_NAME PlayerData içinde tanımlanan anahtar ismiyi içerir.
    • oyuncupara sayısını ve ilişkili lider tablosu statistiklerini güncellemeye yardımcı işlevi oluşturuldu updatePlayerCoins()
    • Değiştirici print() ifadesini onCoinTouched() ile bir çağrı ile değiştirici updatePlayerCoins() .

Oyun testi

Madeni para koleksiyonunun işlediğini görmek zamanı. oyuniçinde bir madeni para topladığınızda, lider tablosu UI'sinde topladığınız madeni paraları görebilmelisiniz. Oyunuzu test etmek için:

  1. Menü çubuğunda Oyna düğmesine tıklayın. Studio oyun testi moduna girer.

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. Karakterinizi bir paraye dokunmak için hareket ettirin. Eğer yazılımlarınız doğru şekilde çalışıyorsa, lider tablosu UI'si görüntülenir ve daha fazla para topladıkça para sayınızı artırır.