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:
In dem Explorer Fenster bewegen Sie den Mauszeiger über ServerStorage und klicken Sie auf die Schaltfläche ⊕ . Ein Kontextmenü wird angezeigt.
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.
Benenne das Modulskript in PlayerData um.
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_DATAplayerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerDataCode-ErklärungDas 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 PlayerDataDefinieren 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_DATAplayerData[tostring(player.UserId)] = datareturn dataendDefinieren 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]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueend
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:
Im Explorer -Fenster erstellen Sie ein ModuleScript in ServerStorage , dann benennen Sie das Modulskript in Bestenliste um.
Ersetze den Standardcode durch den folgenden Codes:
local Leaderboard = {}-- Eine neue Bestenlisteerstellenlocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- Der Name 'leaderstats' ist ein reservierter Name, den Roblox für die Erstellung einer Bestenlisteerkenntleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Erstellen eines neuen Leaderboard-Statistikwertslocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Statistikwert eines Spieler:inaktualisierenfunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn LeaderboardCode-ErklärungDie 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 Bestenlisteerstellenlocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- Der Name 'leaderstats' ist ein reservierter Name, den Roblox für die Erstellung einer Bestenlisteerkenntleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Erstellen eines neuen Leaderboard-Statistikwertslocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendAktualisieren 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:inaktualisierenfunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueend
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:
Öffne im Explorer -Fenster das Skript, das. PL: die Skripts.
Ersetze den bestehenden Code durch den folgenden Codes:
-- Initialisierung von Diensten und Variablenlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Modulelocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local function updatePlayerCoins(player, updateFunction)-- Aktualisieren Sie den Münztischlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Aktualisieren Sie die Münzen-BestenlisteLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Event-Handler definierenlocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Spieler berührte eine Münzecoin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Event-Listen aktivierenfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endCode-ErklärungDie Änderungen am ursprünglichen CoinService -Skript umfassen:
- 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:
Klicke in der Toolbar auf die Schaltfläche Spielen . Studio wechselt in den Spieltest-Modus.
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.