Jetzt, da du erkennen kannst, wann ein Spieler eine Münze gesammelt hat, musst du zählen, wie viele Münzen Spieler gesammelt haben, und diesen Betrag auf einem Leaderboard sichtbar machen.
Erstelle ein Modul-Skript zur Aufzeichnung der Münzsammelung
Um die Speicherung und Verwaltung der Münzsammelungsdaten jedes Spielers zu verwalten, musst du ein ModuleScript-Objekt erstellen, das eine Datenstruktur und Funktionen enthält, die auf die Münzsammelungsdaten für jeden Spieler zugreifen. Modul-Skripte sind wiederverwendbare Codes, die andere Skripte anfordern können. In diesem Fall benötigt der CoinService dieses Modul-Skript, damit es die Münzsammelungsdaten aktualisieren kann, wenn Spieler Münzen berühren.
Erstelle PlayerDataErstelle im ServerStorage ein Modul-Skript mit dem Namen PlayerData mit folgendem Code:```lualocal PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}local function defaultPlayerData()return {[PlayerData.COIN_KEY_NAME] = 0}endlocal function getData(player)local data = playerData[tostring(player.UserId)] or defaultPlayerData()playerData[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 PlayerData```
Das Modul-Skript definiert eine PlayerData-Tabelle, die null oder viele playerData-Tabellen enthält, die die Münzsammelungsdaten für einen Spieler repräsentieren. Jedes Skript, das dieses Modul-Skript anfordert, erhält dieselbe Kopie der PlayerData-Tabelle, sodass mehrere Skripte die Münzsammelungsdaten ändern und teilen können.
Die Datenstrukturen deklarieren
Das Modul-Skript beginnt mit der Deklaration einer leeren Tabelle, PlayerData, die am Ende des Skripts zurückgegeben wird. Es enthält auch Zugriffsmethoden, um Werte in der Tabelle zu erhalten und festzulegen.
Die playerData-Tabelle enthält Kommentare, die die Struktur der Tabelle beschreiben, was den Code leichter verständlich macht. In diesem Fall enthält eine playerData-Tabelle eine userId und ein entsprechendes Feld namens Coins, das die Anzahl der gesammelten Münzen für diesen Spieler darstellt.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerData
Definiere einen lokalen Datenzugriffsmechanismus
getData() ist eine lokale Funktion, die Daten für eine bestimmte playerData-Tabelle abruft. Wenn ein Spieler keine Münze gesammelt hat, gibt sie eine Tabelle aus der Funktion defaultPlayerData() zurück, um sicherzustellen, dass jeder Spieler einige Daten hat, die mit ihm verknüpft sind. Eine gängige Konvention ist es, einfache, öffentlich zugängliche Funktionen zu erstellen, die die Logik an lokal definierte Funktionen auslagern, die die Hauptarbeit erledigen.
local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
playerData[tostring(player.UserId)] = data
return data
end
Öffentliche Datenzugriffsmechanismen definieren
getValue() und updateValue() sind öffentlich zugängliche Funktionen, die andere Skripte, die dieses Modul-Skript anfordern, aufrufen können. In unserem Fall verwendet der CoinService diese Funktionen, um die Münzsammelungsdaten eines Spielers zu 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 ein Leaderboard
Du kannst die Münzsammelungsdaten visuell mit einem Leaderboard auf dem Bildschirm darstellen. Roblox enthält ein integriertes System, das automatisch ein Leaderboard mit einer Standard-UI erstellt.
Erstelle LeaderboardErstelle im ServerStorage ein Modul-Skript mit dem Namen Leaderboard mit folgendem Code:```lualocal Leaderboard = {}-- Erstellen eines neuen Leaderboardslocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' ist ein reservierter Name, den Roblox für das Erstellen eines Leaderboards erkenntleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Erstellen eines neuen Leaderboard-Staatstwerteslocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Aktualisierung eines Spielerstatwertesfunction 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 Leaderboard```
Die folgenden Abschnitte beschreiben, wie das Leaderboard genauer funktioniert.
Ein Leaderboard erstellen
Die Funktion setupLeaderboard() erstellt eine neue Ordnerinstanz mit dem Namen leaderstats und setzt sie als Kind des angegebenen Spielers. Roblox erkennt automatisch einen Ordner mit dem Namen leaderstats als Container für Statistiken und erstellt ein UI-Element, um die Statistiken anzuzeigen. Es erfordert, dass die Werte in leaderstats als "Wert"-Objekte gespeichert werden (wie StringValue, IntValue oder NumberValue).
-- Erstellen eines neuen Leaderboards
local function setupLeaderboard(player)
local leaderstats = Instance.new("Folder")
-- 'leaderstats' ist ein reservierter Name, den Roblox für das Erstellen eines Leaderboards erkennt
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
return leaderstats
end
-- Erstellen eines neuen Leaderboard-Staatstwertes
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 Stat-Werte für einen bestimmten Spieler oder für das Leaderboard selbst, wenn es noch nicht existiert.
FindFirstChild() nimmt den Namen eines Objekts und gibt das Objekt zurück, wenn es existiert, oder nil, wenn nicht. Es ist eine gängige, sichere Methode, um herauszufinden, ob ein Objekt existiert, bevor du es verwendest.
-- Aktualisierung eines Spielerstatwertes
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
Integriere die Modul-Skripte
Mit beiden Modulen an Ort und Stelle, fordere sie im CoinService-Skript an, um die Spieldaten der Spieler zu verwalten und anzuzeigen.
Aktualisiere CoinServiceErsetze im ServerScriptService den bestehenden CoinService-Skriptcode durch den folgenden:```lua-- Initialisieren 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)-- Aktualisiere die Münztabellelocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- Aktualisiere das Münz-LeaderboardLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- Definieren des Ereignis-Handlerslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Spieler berührt 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-- Einrichten der Ereignis-Listenerfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
Die Änderungen am ursprünglichen CoinService-Skript umfassen:
- Deklarieren von COIN_AMOUNT_TO_ADD als die Anzahl von Münzen, die hinzugefügt werden, wenn ein Spieler eine Münze einsammelt, und COIN_KEY_NAME als den Schlüssel Namen, der in PlayerData definiert ist.
- Erstellen der Hilfsfunktion updatePlayerCoins(), um die Münzzählung des Spielers und den zugehörigen Leaderboard-Stat zu aktualisieren.
- Ersetzen der Platzhalteranweisung print() in onCoinTouched() durch einen Aufruf von updatePlayerCoins().
Spieltest
Wähle Test aus dem Dropdown-Menü und klicke auf Play. Geh in eine Münze und bestätige, dass das Leaderboard in der Ecke erscheint und dass deine Münzzahl steigt, während du weitere Münzen sammelst.