Spielerdaten aufzeichnen und anzeigen

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.


Jetzt, da Sie erkennen können, wenn ein Spieler eine Münze gesammelt hat, zeigt dieser Abschnitt des Tutorials Ihnen, wie Sie zählen können, wie viele Münzen Spieler gesammelt haben, und diesen Betrag auf einer Bestenlistesichtbar machen.

Erstellen Sie ein Modul-Skript, um Münzen-Sammlung aufzuzeichnen

Um die Speicherung und Verwaltung der Münzsammlungsdaten jedes Spieler:inzu verwalten, musst du ein ModuleScript -Objekt erstellen, das eine Datenstruktur und Funktionen enthält, die auf Münzsammlungsdaten für jeden Spieler:inzugreifen. Modul-Skripte sind wiederverwendbare Code, die andere Skripte erfordern können. In diesem Fall erfordert CoinService dieses Modul-Skript, damit es Münz

Um ein Skript, das. PL: die Skriptszu erstellen:

  1. In dem Explorer-Fenster bewegen Sie den Mauszeiger über ServerStorage und klicken Sie auf die Schaltfläche . Ein Kontextmenü wird angezeigt.

  2. Vom Kontextmenü aus, wählen Sie ModulScript . Ein neues Modul-Skript wird unter ServerStorage angezeigt. Sie platzieren ein Modul-Skript in ServerStorage , da Sie die Münzen-Sammlungslogik auf dem Server verwalten möchten.

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. Das Modul-Skript umbenennen in PlayerData .

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. Ersetzen Sie den Standardcode durch den folgenden Codes:


    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

    Das Modul-Skript definiert eine PlayerData Tabelle, die entweder null oder mehrere playerData Tabeln enthält, die Münzdaten für einen Spieler repräsentieren. Jeder Skript, der dieses Modul-Skript erfordert, erhält die gleiche Kopie der PlayerData Tabelle, so dass mehrere Skripte Münzdaten für einen Spieler ändern und teilen können.

    Erklärung der Datenstrukturen

    Das Modul-Skript beginnt mit einer Erklärung einer leeren Tabelle, PlayerData, die am Ende des Skript, das. PL: die Skriptszurückgegeben wird. Es enthält auch Zugangsmethoden, um Werte in der Tabelle zu erhalten und zu setzen.

    Die playerData Tabelle enthält Kommentare, die die Struktur der Tabelle beschreiben, was den Code leichter zu verstehen macht. In diesem Fall enthält eine playerData Tabelle einen userId und ein entsprechendes Feld mit dem Namen 1> Coins1>, das die gesammelten Münzen für diesen Spieler:inrepräsentiert.


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

    Lokalen Daten-Zubehör definieren

    getData() ist eine lokale Funktion, die Daten für eine bestimmte playerData -Tabelle abruft. Wenn ein Spieler keine Münze gesammelt hat, gibt er eine DEFAULT_PLAYER_DATA -Tabelle zurück, um sicherzustellen, dass jeder Spieler einige Daten mit ihnen in Verbindung bringt. Eine gängige Konvention ist es, einfache, öffentlich zugängliche Funktionen


    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

    Publik-Daten-Zugriffsorganisatoren definieren

    getValue() UpdateValue() sind öffentlich zugängliche Funktionen, die andere Skripte, die dieses Modul-Skript erfordern, aufrufen können. In unserem Fall verwendet updateValue() diese Funktionen, um die Münzsammlungsdaten eines Spieler:inzu aktualisieren, wenn dieser eine Münze berührt.


    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

implementiere eine Rangliste

Sie können die Münzsammlungsdaten visuell mit einem Bestenlistedarstellen. Roblox enthält ein integriertes System, das automatisch eine Leaderboard mit einer Standard-UI erstellt.

Um die Bestenlistezu erstellen:

  1. Im Explorer-Fenster erstellen Sie ein ModulScript in ServerStorage , und dann benennen Sie das Modulskript zu 1> Leaderboard1> um.

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. Ersetzen Sie den Standardcode durch den folgenden Codes:


    local Leaderboard = {}
    -- Erstellen einer neuen Bestenliste
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 'leaderstats' ist ein reservierter Name, den Roblox für die Erstellung einer Bestenlisteanerkennt
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Erstellen eines neuen Leaderboard-Wertes
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- Aktualisieren des Statistikwerts eines Spieler:in
    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

    Die folgenden Abschnitte beschreiben, wie die Rangliste in mehr Details funktioniert.

    Einen Bestenlisten-Ersteller erstellen

    Die setupLeaderboard() -Funktion erstellt eine neue Ordnerinstanz namens leaderstats und setzt sie als Kind des angegebenen Spieler:in. Roblox erkennt automatisch einen Ordner namens leaderstats


    -- Erstellen einer neuen Bestenliste
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 'leaderstats' ist ein reservierter Name, den Roblox für die Erstellung einer Bestenlisteanerkennt
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Erstellen eines neuen Leaderboard-Wertes
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    Spielerstatistiken aktualisieren

    setStat() ist die einzige öffentliche Funktion im Leaderboard-Modul . Sie erstellt Statistikwerte für einen bestimmten Spieler oder die Leaderboard selbst, wenn sie noch nicht existiert.

    FindFirstChild() nimmt den Namen eines Objekts und gibt das Objekt zurück, wenn es existiert, oder nil wenn es nicht existiert. Es ist eine gemeinsame, sichere Methode, um zu überprüfen, ob ein Objekt vor dem Gebrauch existiert.


    -- Aktualisieren des Statistikwerts eines Spieler:in
    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

Die Modul-Skripte integrieren

Mit sowohl PlayerData und Leaderboard Modul-Skripten abgeschlossen, benötigen Sie sie im CoinService Skript, um Spieler-Münzen-Daten zu verwalten und anzuzeigen. Um 2> CoinService2> zu aktualisieren:

  1. In dem Explorer-Fenster öffnen Sie das Skript, das. PL: die Skripts .

  2. Ersetzen Sie den bestehenden Code durch den folgenden Codes:


    -- Dienste und Variablen initialisieren
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Module
    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)
    -- Aktualisieren Sie den Münztisch
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
    -- Aktualisieren Sie die Münzen-Bestenliste
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    end
    -- Verdefinieren des Ereignishändlers
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Der Spieler hat eine Münze berührt
    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
    -- Ereignis-Listen einrichten
    for _, coin in coins do
    coin:SetAttribute("Enabled", true)
    coin.Touched:Connect(function(otherPart)
    onCoinTouched(otherPart, coin)
    end)
    end

    Die Änderungen am ursprünglichen CoinService Skript umfassen:

    • Importieren der PlayerData und Leaderboard Modul mit der require() Funktion.
    • Erklärung von COIN_AMOUNT_TO_ADD als die Anzahl der Münzen, die ein Spieler sammelt, und COIN_KEY_NAME als der Schlüsselname definiert ist, in PlayerData .
    • Erstellen der Hilfsfunktion updatePlayerCoins() , um die Münzen des Spieler:inund die zugeordnete Bestenliste-Statistik zu aktualisieren.
    • Ersetzen der Platzhalter print() mit der Anweisung onCoinTouched() mit einem Aufruf zu updatePlayerCoins().

Spieltest

Es ist Zeit zu sehen, ob die Münzsammlung wie vorgesehen funktioniert. Wenn Sie eine Münze im Spiel berühren und sammeln, sollten Sie in der Münzen-Ansicht auf der Leaderboard sehen können, wie viele Münzen Sie gesammelt haben. Um Ihr Erlebnis zu testen:

  1. In der Menüleiste klicken Sie auf die Schaltfläche Spielen . Studio betritt den Spieltest-Modus.

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. Bewegen Sie Ihren Charakter, um eine Münze zu berühren. Wenn Ihre Skripte richtig funktionieren, wird die Münzen-Bestenliste angezeigt und Ihre Münzenzahl erhöht, wenn Sie mehr Münzen sammeln.