Aufzeichnen und anzeigen von Spielerdaten

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


Jetzt, da du erkennen kannst, wann ein Spieler eine Münze gesammelt hat, lehrt dieser Abschnitt des Tutorials dich, wie viele Münzen Spieler gesammelt haben und diese Menge auf einer Bestenlistesichtbar machen.

Erstelle ein Modulskript, um die Sammlungenaufzuzeichnen

Um die Lagerung und Verwaltung der Münzsammlungsdaten jedes Spieler:inzu verwalten, musst du ein ModuleScript erstellen, das eine Datenstruktur und Funktionen enthält, die auf Münzsammlungsdaten für jeden Spieler:inzugreifen.Modul-Skripte sind wiederverwendbarer Code, den andere Skripte erfordernkönnen.In diesem Fall benötigt das CoinService -Skript dieses Moduls, damit es die Münzsammlungsdaten aktualisieren kann, wenn Spieler Münzen berühren.

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. Wählen Sie aus dem Kontextmenü ModuleScript .Ein neues Modulskript wird unter ServerStorage angezeigt.Du platzierst ein Modulskript in ServerStorage , weil du die Münzsammlungslogik auf dem Server verwalten möchtest.

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. Benenne das Modulskript in PlayerData um.

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. Ersetze 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 Modulskript definiert eine PlayerData Tabelle, die null oder viele playerData Tabellen enthält, die Daten zur Münzsammelung für einen Spieler:indarstellen.Jedes Skript, das dieses Modulskript erfordert, erhält die gleiche Kopie der PlayerData Tabelle, wodurch mehrere Skripte die Möglichkeit erhalten, Münzsammlungsdaten zu modifizieren und zu teilen.

    Erkläre die Datenstrukturen

    Das Modulskript beginnt mit einer Erklärung einer leeren Tabelle, PlayerData, die am Ende des Skript, das. PL: die Skriptszurückgegeben wird.Es enthält auch Zubehör-Methoden, 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 eine userId und ein entsprechendes Feld mit dem Namen Coins, das die Menge der gesammelten Münzen für diesen Spieler:indarstellt.


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

    Definieren Sie einen lokalen Datenzugriffsorganisator

    getData() ist eine lokale Funktion, die Daten für einen bestimmten playerData Tisch 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 sich hat.Eine häufige Konvention ist es, einfache, öffentlich zugängliche Funktionen zu erstellen, die die Logik auf lokal skalierte Funktionen übertragen, die das Schwertransportieren übernehmen.


    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

    Definieren Sie öffentliche Datenzugriffe

    getValue() und updateValue() sind öffentliche Funktionen, die andere Skripte, die dieses Modulskript benötigen, aufrufen können.In unserem Fall verwendet der CoinService diese Funktionen, um die Münzsammlungsdaten eines Spieler:inzu aktualisieren, wann immer dieser Spieler 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 Bestenliste

Du kannst die Münzsammlungsdaten visuell mit einer On-Screen-Bestenliste darstellen.Roblox enthält ein integriertes System, das automatisch eine Rangliste erstellt, indem eine Standard-Benutzeroberfläche verwendet wird.

Um die Bestenlistezu erstellen:

  1. Im Explorer -Fenster erstellen Sie ein ModuleScript in ServerStorage , dann benennen Sie das Modulskript in Bestenliste um.

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


    local Leaderboard = {}
    -- Eine neue Bestenlisteerstellen
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- Der Name 'leaderstats' ist ein reservierter Name, den Roblox für die Erstellung einer Bestenlisteerkennt
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- Erstellen eines neuen Leaderboard-Statistikwerts
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- Statistikwert eines Spieler:inaktualisieren
    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 im Detail funktioniert.

    Erstelle eine Rangliste

    Die setupLeaderboard()-Funktion erstellt eine neue Ordnerinstanz mit dem Namen leaderstats und setzt sie als Kind des angegebenen Spieler:in.Roblox erkennt automatisch einen Ordner mit dem Namen leaderstats als Container von Statistiken und erstellt ein UI-Element, um die Statistiken anzuzeigen.Es erfordert, dass die Werte in leaderstats als "Wert"-Objekte gespeichert werden (z. B. StringValue , IntValue oder NumberValue ).


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

    Aktualisieren von Spielerstatistiken

    setStat() ist die einzige öffentliche Funktion im Modul Bestenliste .Es erstellt Statistikwerte für einen bestimmten Spieler oder die Rangliste 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 herauszufinden, ob ein Objekt existiert, bevor du es verwendest.


    -- Statistikwert eines Spieler:inaktualisieren
    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

Modul-Skripte integrieren

Mit den Skripten der Module Spielerdaten und Bestenliste vollständig, benötigen sie sie im Münzservice -Skript, um Spieler-Münzdaten zu verwalten und anzuzeigen.Um CoinService zu aktualisieren:

  1. Öffne im Explorer -Fenster das Skript, das. PL: die Skripts.

  2. Ersetze den bestehenden Code durch den folgenden Codes:


    -- Initialisierung von Diensten und Variablen
    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
    -- Event-Handler definieren
    local function onCoinTouched(otherPart, coin)
    if coin:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Spieler berührte eine Münze
    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
    -- Event-Listen aktivieren
    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:

    • Import der Spielerdaten - und Bestenliste -Module mit der require().
    • Deklarieren von COIN_AMOUNT_TO_ADD als Anzahl der Münzen, die hinzugefügt werden, wenn ein Spieler eine Münze sammelt, und COIN_KEY_NAME als Schlüsselname, der in PlayerData definiert ist.
    • Erstellung der Hilfsfunktion updatePlayerCoins(), um die Münzanzahl des Spieler:inund den damit verbundenen Bestenlistenstatus zu aktualisieren
    • Ersetzung der Platzhalter print() Aussage in onCoinTouched() durch einen Anruf bei updatePlayerCoins().

Spieltest

Es ist Zeit, zu sehen, ob die Münzsammlung wie beabsichtigt funktioniert.Wenn du eine Münze im Spiel berührst und sammelst, solltest du in der Lage sein, die Menge der gesammelten Münzen auf der Leaderboard-Benutzeroberfläche zu sehen.Um dein Erlebnis zu testen:

  1. Klicke in der Toolbar auf die Schaltfläche Spielen . Studio wechselt in den Spieltest-Modus.

    Play button highlighted in Studio's playtesting options.
  2. Bewegen Sie Ihren Charakter, um eine Münze zu berühren.Wenn deine Skripte richtig funktionieren, wird die Rangliste-Benutzeroberfläche angezeigt und die Anzahl deiner Münzen erhöht, wenn du mehr Münzen sammelst.