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 edebildiğinize göre, bu eğitimin bu bölümü, oyuncuların kaç para topladığını saymayı ve bu miktarı bir liderlik tablosugörünür hale getirmeyi öğretir.

Para koleksiyonunu kaydetmek için bir modül senaryosu oluştur

Her oyuncunun para koleksiyonu verilerini depolayıp yönetmek için, her oyuncunun para koleksiyonu verilerine erişen bir veri yapısı ve işlevleri içeren bir ModuleScript nesne oluşturmanız gerekir.Modül kodları, diğer kodların gerektirebileceği yeniden kullanılabilir koddur.Bu durumda, CoinService bu modül senaryosunu gerektirir, böylece oyuncular para dokununca para koleksiyonu verilerini güncelleyebilir.

Bir modül senaryosu oluşturmak için:

  1. Araştırıcı penceresinde, Sunucu Depolama üzerine gelin ve ⊕ düğmesine tıklayın. Bir bağımsız menü görüntülenir.

  2. Kontekst menüsünden ModülScript seçin.Yeni bir modül senaryosu ServerStorage altında görüntülenir.Sunucuda para koleksiyon mantığını yönetmek istediğiniz için bir modül kodunu ServerStorage içine yerleştiriyorsunuz çünkü sunucuda para koleksiyon mantığını yönetmek istiyorsunuz.

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

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. Varsayılan kodu aşağıdaki 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 oyuncunun para koleksiyonu verilerini temsil eden sıfır veya çok sayıda PlayerData tablo içeren bir playerData tablosu tanımlar.Bu modül koduna ihtiyaç duyan her senaryo, PlayerData tablosunun aynı kopyasını alır ve çok sayıda senaryonun para koleksiyonu verilerini değiştirmesine ve paylaşmasına izin verir.

    Veri yapılarını ilan et

    Modül kodu, boş bir tablo ilanı ile başlar, PlayerData , kodun sonunda geri döndürülür.Ayrıca tabloda değerler almak ve ayarlamak için yardımcı yöntemler de içerir.

    playerData tablosu, kodu daha kolay anlamak için tablonun yapısını tanımlayan yorumlar içerir.Bu durumda, bir playerData tablosu bir userId ve bu oyuncunun topladığı para miktarını temsil eden bir alan olan Coins adlı bir alan içerir.


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

    Yerel bir veri erişimcisini tanımlayın

    getData() özel bir playerData tablosu için veri alan yerel bir işlevdir.Bir oyuncu bir para toplamadıysa, her oyuncunun onlarla ilgili bazı verilere sahip olduğundan emin olmak için bir DEFAULT_PLAYER_DATA tablosu döndürür.Ortak bir anlaşma, ağır kaldırmayı yapan yerel ölçekli işlevlere mantığı yükleyen basit, halka açık işlevler oluşturmaktır.


    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

    Halka açık veri erişimcilerini tanımlayın

    getValue() ve updateValue() özellikle bu modül kılavuzuna ihtiyaç duyan diğer kodların çağırabileceği halka açık işlevlerdir.Bizim durumumuzda, CoinService bu işlevleri kullanarak bir oyuncunun para koleksiyonu verilerini herhangi bir zamanda günceller, oyuncu bir paraya dokunduğunda.


    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 liderlik tablosuuygulayın

Ekran üzeri liderlik tablosuile para koleksiyonu verilerini görsel olarak temsil edebilirsiniz.Roblox, varsayılan bir UI kullanarak otomatik olarak bir lider tablosu oluşturan bir dahili sistem içerir.

liderlik tablosutablosu oluşturmak için:

  1. Araştırmacı penceresinde, Sunucu Depolama 'da bir ModülScript oluşturun, ardından modül kaydını Liderlik Tablosu olarak yeniden adlandırın.

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


    local Leaderboard = {}
    -- Yeni bir liderlik tablosuoluşturma
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- liderlik tablosutablosu oluşturmak için Roblox tarafından tanınan rezerve edilmiş bir isim 'leaderstats'
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Yeni bir lider tablosu istatistik değeri oluşturma
    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 daha ayrıntılı olarak nasıl çalıştığını açıklar.

    Bir lider tablosu oluşturun

    The setupLeaderboard() fonksiyonu, adı leaderstats olan yeni bir klasör örneği oluşturur ve belirtilen oyuncunun bir çocuğu olarak ayarlar.Roblox, leaderstats adlı bir klasörü istatistiklerin bir kutusu olarak otomatik olarak tanır ve istatistikleri görüntülemek için bir UI öğesi oluşturur.Değerlerin leaderstats depolanması gerekir "değer" nesneleri olarak (örneğin StringValue , IntValue veya NumberValue gibi).


    -- Yeni bir liderlik tablosuoluşturma
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- liderlik tablosutablosu oluşturmak için Roblox tarafından tanınan rezerve edilmiş bir isim 'leaderstats'
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Yeni bir lider tablosu istatistik değeri oluşturma
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    Oyuncu istatistiklerini güncelle

    setStat() Lider tablosu modülündeki tek kamu işlevidir.Zaten mevcut değilse belirlenmiş bir oyuncu veya lider tablosu için istatistik değerleri oluşturur.

    FindFirstChild() bir nesnenin adını alır ve varsa nesneyi döndürür, yoksa nil döndürmez.Bir nesnenin kullanmadan önce var olup olmadığını öğrenmenin yaygın ve 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ı birleştirin

Hem OyuncuVerileri hem de LiderTablosu modül kodları tamamlandıktan sonra, oyuncu para verilerini yönetmek ve görüntülemek için ParaHizmeti kodundaki onlara ihtiyacınız var.Güncelle CoinService :

  1. Gezgin penceresinde, CoinService kodunu açın.

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


    -- Hizmetler ve değişkenlerin başlatılması
    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 tablosunu güncelle
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
    -- Para lider liderlik tablosugüncelle
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    end
    -- Etkinlik işleyicisini 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 dokundu
    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 dinleyicilerini ayarlama
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    Orijinal CoinService scriptine yapılan değişiklikler şunları içerir:

    • İçeri aktarma OyuncuVerileri ve LiderTablosu modülleri ile fonksiyonu.
    • Bir oyuncu bir para topladığında eklenmesi gereken para sayısı olarak COIN_AMOUNT_TO_ADD ilan edilir ve COIN_KEY_NAME OyuncuVerileri 'de tanımlanan anahtar adı olarak.
    • Oyuncunun para sayısını ve ilişkili lider tablosu statünü güncelleştirmek için yardımcı işlev oluşturma updatePlayerCoins() Türkçe: oyuncupara sayısını ve ilişkili lider tablosu statünü güncelleştirmek için yardımcı işlev oluşturma
    • Yer tutucu print() ifadesini onCoinTouched() 'a bir çağrı ile değiştirerek updatePlayerCoins() 'a yönlendiriliyor.

Oynatma testi

Para koleksiyonunun hedeflendiği gibi çalışıp çalışmadığını görmenin zamanı geldi.oyunbir para dokunup topladığınızda, lider tablosu UI'sinde topladığınız para miktarını görebilmelisiniz.Deneyiminizi test etmek için:

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

    Play button highlighted in Studio's playtesting options.
  2. Karakterini bir para dokunmak için hareket ettir.Eğer senaryolarınız doğru çalışıyorsa, lider tablosu arayüzü görüntülenir ve daha fazla para toplarken para sayınız artar.