In vorherigen Tutorials hast du eine Vielzahl von Spielelementen erstellt, darunter fading platforms und tödliche Lava. Dieses Tutorial verbindet diese Elemente zu einem spielbaren Spiel, in dem die Benutzer sehen, wer am längsten überleben kann. Für jede Sekunde, die sie am Leben bleiben, wird ein Punkt zu ihrem Score hinzugefügt.
Einrichten
Zuerst musst du die Szene für dein Spiel einrichten. Dupliziere die fading platforms, die du im vorherigen Tutorial erstellt hast, und lasse die Benutzer gegeneinander antreten, um so lange wie möglich auf den Plattformen zu bleiben.
Du kannst auch tödliche Lava verwenden, um Benutzer zu töten, wenn sie von den Plattformen fallen, oder sie einfach ihrem Schicksal überlassen. Stelle sicher, dass du einen SpawnLocation an einem Ort platzierst, an dem die Benutzer auf die Plattformen springen können, um zu spielen.

Spielerpunkte
Roblox hat ein integriertes Leaderboard, um die Statistiken der Benutzer anzuzeigen. Wenn du die Spielerpunkte über das Leaderboard festlegst, erscheinen sie auf der rechten Seite des Bildschirms im Spiel.

Du wirst in späteren Tutorials mehr anpassbare Möglichkeiten lernen, Informationen anzuzeigen, aber das Leaderboard ist der einfachste Weg, ein sichtbares Punktesystem in Roblox zu erstellen.
Es ist am besten, Skripte, die den Spielstatus einrichten, in ServerScriptService zu platzieren, da sie automatisch ausgeführt werden, wenn das Spiel startet. Erstelle in ServerScriptService ein Skript mit dem Namen SetupPoints.

Auf Spieler hören
In Roblox ist ein Service ein Objekt, das eine Reihe nützlicher Funktionen ausführt. Der Players-Service hat ein Ereignis namens PlayerAdded, das du verwenden kannst, um Punkte für jeden Benutzer einzurichten, der dem Spiel beitritt.
Du kannst auf Services mit der Funktion GetService im game-Objekt zugreifen. game ist eine Variable, die von überall zugänglich ist und alles in deinem Spiel enthält.
Erstelle eine Variable für den Players-Service mit game:GetService("Players").
Erstelle eine Funktion namens onPlayerAdded mit einem Parameter für den eintreffenden Spieler.
Verbinde die Funktion onPlayerAdded mit dem PlayerAdded-Ereignis.
local Players = game:GetService("Players")local function onPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)
Erstelle einen Statistiken-Ordner
Um die Punkte eines Benutzers im Leaderboard anzuzeigen, musst du lediglich einen neuen Folder in ihrem Player-Objekt mit dem Namen "leaderstats" erstellen und ihre Punkte dort ablegen. Neue Objekte können innerhalb eines Skripts über die Funktion Instance.new() erstellt werden.
Erstelle ein neues Folder-Objekt mit Instance.new("Folder") und speichere das Ergebnis in einer neuen Variable namens leaderstats.
local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")endSetze die Name-Eigenschaft von leaderstats auf "leaderstats".
Setze leaderstats als Elternteil von player.
local Players = game:GetService("Players")local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = playerendPlayers.PlayerAdded:Connect(onPlayerAdded)
Punkte erstellen
Das Leaderboardsystem liest alle Werte im leaderstats-Ordner und zeigt alles an, was es findet.
Um eine Statistik hinzuzufügen, die die Punkte eines Spielers verfolgt, kann ein neues IntValue-Objekt im leaderstats-Ordner als Elternteil hinzugefügt werden. Der Name des Wertobjekts wird zusammen mit seinem aktuellen Wert angezeigt.
- Setze den Name auf "Points".
- Setze den Value auf 0; dies ist das, was das Leaderboard zunächst für den Spieler anzeigen wird.
- Setze das points-Objekt als Elternteil des leaderstats-Ordners.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
end
Players.PlayerAdded:Connect(onPlayerAdded)Teste dein Spiel und du solltest sehen, dass das Leaderboard oben rechts mit den Namen deiner Benutzer und einer Punktzahl neben ihnen erscheint.
Zeit zählen
Jeder Benutzer sollte für jede Sekunde, die er am Leben ist, einen Punkt verdienen. Eine while-Schleife und die Funktion task.wait() können verwendet werden, um den Wert der Punkte jede Sekunde zu aktualisieren.
- Am Ende des Skripts erstelle eine while-Schleife mit true als Bedingung.
- In der Schleife task.wait() für 1 Sekunde.
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
endSpielerliste
Um Code für jeden Benutzer im Spiel auszuführen, musst du durch das Array der Benutzer iterieren, das von der Funktion GetPlayers zurückgegeben wird.
Ein Array ist eine Liste von Elementen, die in der Reihenfolge gespeichert sind. Jedes Element kann über seine Index-Position abgerufen werden, beginnend bei 1. Du kannst die Länge eines Arrays erhalten, indem du es mit # voranstellst.
- Speichere das Ergebnis von Players:GetPlayers() in einer playerList-Variable.
- Erstelle eine for-Schleife mit einem Startwert von 1 und einem Endwert von #playerList, sodass du eine Iteration der Schleife pro Spieler erhältst.
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- Füge hier deine Logik für jeden Spieler in der playerList hinzu
end
endPunkte vergeben
Um jedem Benutzer in der for-Schleife einen Punkt zu vergeben, musst du den Benutzer aus dem Array abrufen und 1 zum Points-Objekt hinzufügen, das in ihrem leaderstats-Ordner gespeichert ist.
Objekte, die in einem Array gespeichert sind, werden mit eckigen Klammern abgerufen - zum Beispiel kann das erste Element im playerList-Array mit playerList[1] abgerufen werden. Wenn du playerList[currentPlayer] in der for-Schleife schreibst, kannst du mit jeder Iteration der Schleife durch jeden Benutzer in der Liste gehen.
- Speichere den Benutzer bei playerList[currentPlayer] in einer Variablen namens player.
- Speichere das Points-Objekt des Benutzers in einer Variablen namens points.
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
local player = playerList[currentPlayer]
local points = player.leaderstats.Points
points.Value += 1
end
endTeste dein Spiel und du solltest feststellen, dass das Leaderboard die Punktzahl deines Spielers jede Sekunde um 1 erhöht.
Auf Charaktere hören
Das Ziel des Spiels ist es, zu sehen, wer am längsten am Leben bleibt, daher müssen Benutzer, die sterben, ihre Punkte auf 0 zurücksetzen.
Du musst das Character-Modell des Benutzers abrufen, um zu erkennen, wann sie gestorben sind. Dieses Modell wird erst nach dem Laden des Player-Objekts hinzugefügt, und du kannst das Ereignis CharacterAdded verwenden, um zu hören, wann der Charakter bereit ist, verwendet zu werden. Erstelle eine Funktion namens onCharacterAdded mit zwei Parametern: einem für den Charakter, einem für den Spieler.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")Obwohl du den Benutzer in den Parametern der Funktion onCharacterAdded eingeschlossen hast, gibt das tatsächliche CharacterAdded-Ereignis nur den Charakter zurück, nicht den zugehörigen Benutzer. Um das player-Objekt ebenfalls zu übergeben, verwende eine anonyme Funktion für die Ereignisverbindung.
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
endPunkte zurücksetzen
Wenn ein Benutzer stirbt, wird automatisch ein Humanoid-Ereignis Died ausgelöst. Du kannst dieses Ereignis verwenden, um herauszufinden, wann du ihre Punkte zurücksetzen musst.
Der Humanoid befindet sich im Charaktermodell, aber die Inhalte dieses Modells werden erst zusammengebaut, wenn der Benutzer spawnt. Um deinen Code sicher auf das Laden des Humanoid-Objekts warten zu lassen, verwende die Funktion WaitForChild(). Du kannst sie auf jedem übergeordneten Objekt aufrufen und den Namen des Kindes übergeben, auf das du wartest. Erstelle eine Variable, um auf den Humanoid zu warten, indem du character:WaitForChild("Humanoid") verwendest.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
endDie Funktion, die du mit dem Died-Ereignis verbinden musst, ist sehr kurz und wird nur hier benötigt, daher kannst du erneut eine anonyme Funktion verwenden.
- Verbinde eine neue anonyme Funktion mit dem Died-Ereignis des Humanoids.
- In der anonymen Funktion erstelle eine Variable namens points für das Points-Objekt des Spielers.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
end)
endTeste dies aus und du wirst sehen, dass die Punktzahl des Benutzers zurückgesetzt wird, wenn sie sterben.
Überprüfe den Spieler
Wenn Benutzer weiterhin Punkte verdienen, selbst wenn sie tot sind, ist das kaum im Geiste des Spiels, daher muss der Code überprüfen, ob Benutzer am Leben sind, bevor sie einen Punkt vergeben.
Du musst damit beginnen, ein Attribut in der Funktion onPlayerAdded zu definieren, das verwendet werden kann, um zu überprüfen, ob der Benutzer am Leben ist. Zu diesem Zeitpunkt ist der Benutzer noch nicht am Leben und gespawnt, da ihr Charaktermodell noch hinzugefügt werden muss.
Attribute ermöglichen es dir, Objekte in Roblox mit deinen eigenen Daten anzupassen. Ein Attribut besteht aus einem Namen und einem Wert. Du kannst eines auf jedem Objekt mit der Funktion SetAttribute erstellen. Rufe SetAttribute auf player auf, um ein neues Attribut mit dem Namen "IsAlive" und dem Wert false zu erstellen.
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
endSobald das Charaktermodell des Benutzers respawnt, muss der Wert von IsAlive auf true geändert werden, damit der Benutzer wieder Punkte verdienen kann.
- Setze in onCharacterAdded das IsAlive-Attribut von player auf true.
- Setze in onCharacterDied das IsAlive-Attribut von player auf false.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
endSchließlich sollte IsAlive überprüft werden, bevor Punkte in der while-Schleife am Ende des Skripts vergeben werden. Die Funktion GetAttribute nimmt den Namen eines Attributs und gibt den Wert zurück. In der while-Schleife umschließe den Code zur Vergabe eines Punktes in einer if-Anweisung mit der Bedingung player:GetAttribute("IsAlive").
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
local player = playerList[currentPlayer]
if player:GetAttribute("IsAlive") then
local points = player.leaderstats.Points
points.Value += 1
end
end
endTeste dein Spiel jetzt aus und du solltest feststellen, dass der Benutzer jede Sekunde Punkte verdient, solange er am Leben ist, und bei 0 bleibt, wenn er nicht am Leben ist. Lass deine Freunde mitspielen und sehen, wer die höchste Punktzahl erreicht.
Das ist erst der Anfang: Du kannst dein Spiel für deine Benutzer weiter verbessern. Hier sind einige Tipps:
- Platziere den Code für alle Plattformen in einem einzigen Skript, um die Aktualisierung zu erleichtern.
- Erstelle einen Lobbybereich, in dem Benutzer warten, um in den Spielbereich teleportiert zu werden, damit die Benutzer gleichzeitig starten können.
- Verkünde die Gewinner jeder Runde.
Endgültiger Code
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for i = 1, #playerList do
local player = playerList[i]
if player:GetAttribute("IsAlive") then
local points = player.leaderstats.Points
points.Value += 1
end
end
end