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:
In dem Explorer-Fenster bewegen Sie den Mauszeiger über ServerStorage und klicken Sie auf die Schaltfläche ⊕ . Ein Kontextmenü wird angezeigt.
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.
Das Modul-Skript umbenennen in PlayerData .
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_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 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 PlayerDataLokalen 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_DATAplayerData[tostring(player.UserId)] = datareturn dataendPublik-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]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueend
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:
Im Explorer-Fenster erstellen Sie ein ModulScript in ServerStorage , und dann benennen Sie das Modulskript zu 1> Leaderboard1> um.
Ersetzen Sie den Standardcode durch den folgenden Codes:
local Leaderboard = {}-- Erstellen einer neuen Bestenlistelocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' ist ein reservierter Name, den Roblox für die Erstellung einer Bestenlisteanerkenntleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Erstellen eines neuen Leaderboard-Werteslocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- Aktualisieren des Statistikwerts eines Spieler:infunction 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 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 Bestenlistelocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' ist ein reservierter Name, den Roblox für die Erstellung einer Bestenlisteanerkenntleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- Erstellen eines neuen Leaderboard-Werteslocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendSpielerstatistiken 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:infunction 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
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:
In dem Explorer-Fenster öffnen Sie das Skript, das. PL: die Skripts .
Ersetzen Sie den bestehenden Code durch den folgenden Codes:
-- Dienste und Variablen initialisierenlocal 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-- Verdefinieren des Ereignishändlerslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Der Spieler hat eine Münze berührtcoin.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-- Ereignis-Listen einrichtenfor _, 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:
- 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:
In der Menüleiste klicken Sie auf die Schaltfläche Spielen . Studio betritt den Spieltest-Modus.
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.