W poprzednich poradnikach stworzyłeś różnorodne elementy doświadczenia, w tym przezroczyste platformy i śmiertelną lawę. Ten poradnik łączy te elementy w grywalne doświadczenie, w którym użytkownicy mogą zobaczyć, kto będzie najdłużej żył. Co sekundę, gdy pozostają przy życiu, punkt zostanie dodany do ich wyniku.
Ustawienia
Na początek musisz ustawić scenę dla swojego doświadczenia. Skopiuj przezroczyste platformy, które stworzyłeś w poprzednim poradniku, i pozwól użytkownikom rywalizować o to, kto najdłużej pozostanie na platformach.
Możesz także użyć śmiertelnej lawy, aby zabić użytkowników, gdy spadną z platform, lub po prostu pozwolić im spaść w przepaść. Upewnij się, że umieścisz SpawnLocation w miejscu, gdzie użytkownicy mogą skakać na platformy, aby zacząć grać.

Punkty gracza
Roblox ma wbudowane Leaderboard, służące do wyświetlania statystyk użytkowników. Kiedy ustawisz punkty gracza przez leaderboard, pojawią się one po prawej stronie ekranu w doświadczeniu.

Więcej informacji na temat bardziej konfigurowalnych sposobów wyświetlania informacji dowiesz się w późniejszych poradnikach, ale leaderboard to najprostszy sposób na stworzenie widocznego systemu punktacji w Roblox.
Najlepiej umieścić skrypty, które ustawiają stan doświadczenia, w ServerScriptService, ponieważ automatycznie będą uruchamiane, gdy doświadczenie się rozpocznie. W ServerScriptService stwórz skrypt o nazwie SetupPoints.

Nasłuchuj graczy
W Robloxie, serwis to obiekt wykonujący szereg użytecznych funkcji. Serwis Players ma zdarzenie o nazwie PlayerAdded, które można wykorzystać do ustawienia punktów dla każdego użytkownika, który dołącza do doświadczenia.
Możesz uzyskać dostęp do serwisów za pomocą funkcji GetService w obiekcie game. game to zmienna dostępna z każdego miejsca, która zawiera wszystko w twoim doświadczeniu.
Stwórz zmienną dla serwisu Graczy, używając game:GetService("Players").
Stwórz funkcję o nazwie onPlayerAdded z jednym parametrem dla dołączającego gracza.
Połącz funkcję onPlayerAdded z wydarzeniem PlayerAdded.
local Players = game:GetService("Players")local function onPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)
Utwórz folder statystyk
Aby pokazać punkty użytkownika w leaderboard, wystarczy utworzyć nowy Folder w ich obiekcie Player o nazwie "leaderstats" i umieścić tam ich punkty. Nowe obiekty można tworzyć z poziomu skryptu za pomocą funkcji Instance.new().
Utwórz nowy obiekt Folder za pomocą Instance.new("Folder"), przechowując wynik w nowej zmiennej o nazwie leaderstats.
local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")endUstaw właściwość Name folderu leaderstats na "leaderstats".
Ustaw leaderstats jako rodzica player.
local Players = game:GetService("Players")local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = playerendPlayers.PlayerAdded:Connect(onPlayerAdded)
Utwórz punkty
System leaderboard odczytuje wszelkie wartości w folderze leaderstats i wyświetla to, co znajdzie.
Aby dodać statystykę, która będzie śledzić punkty gracza, nowy obiekt IntValue można umieścić w folderze leaderstats. Nazwa obiektu wartości będzie wyświetlana obok jego bieżącej wartości.
- Ustaw Name na "Points".
- Ustaw Value na 0; to jest to, co leaderboard początkowo wyświetli dla gracza.
- Ustaw obiekt points jako rodzica foldera leaderstats.
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)
Przetestuj swoje doświadczenie, a powinieneś zobaczyć leaderboard pojawiający się w prawym górnym rogu z nazwiskami twoich użytkowników i przyznanymi im punktami.
Licz czas
Każdy użytkownik powinien zdobywać punkty za każdą sekundę, którą pozostaje przy życiu. Pętla while oraz funkcja task.wait() mogą być użyte do aktualizacji wartości punktów co sekundę.
- Na końcu skryptu utwórz pętlę while, przyjmującą warunek true.
- W pętli, użyj task.wait() czekając na 1 sekundę.
Players.PlayerAdded:Connect(onPlayerAdded)while true dotask.wait(1)end
Lista graczy
Aby wykonać kod dla każdego użytkownika w doświadczeniu, musisz iterować przez tablicę użytkowników zwracaną przez funkcję GetPlayers.
Tablica to lista elementów przechowywana w porządku. Każdy element można uzyskać za pomocą jego indeksu, począwszy od 1. Możesz uzyskać długość tablicy, poprzedzając ją #.
- Przechowaj wynik Players:GetPlayers() w zmiennej playerList.
- Utwórz pętlę for z wartością początkową równą 1 i końcową równą #playerList, aby uzyskać jedną iterację pętli dla każdego gracza.
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList do-- Dodaj swoją logikę tutaj dla każdego gracza w playerListendend
Przyznawanie punktów
Aby przyznać punkt każdemu użytkownikowi w pętli for, musisz uzyskać użytkownika z tablicy i dodać 1 do obiektu Points przechowywanego w ich folderze leaderstats.
Obiekty przechowywane w tablicy są dostępne za pomocą kwadratowych nawiasów - na przykład, pierwszy element w tablicy playerList można uzyskać za pomocą playerList[1]. Jeśli napiszesz playerList[currentPlayer] w pętli for, możesz przemieszczać się po każdym użytkowniku na liście z każdą iteracją pętli.
- Przechowaj użytkownika na playerList[currentPlayer] w zmiennej o nazwie player.
- Przechowaj obiekt Points użytkownika w zmiennej o nazwie points.
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList dolocal player = playerList[currentPlayer]local points = player.leaderstats.Pointspoints.Value += 1endend
Przetestuj swoje doświadczenie i powinieneś zauważyć, że leaderboard pokazuje wynik twoich graczy wzrastający o 1 co sekundę.
Nasłuchuj postaci
Celem doświadczenia jest zobaczenie, kto może przeżyć najdłużej, więc użytkownicy, którzy umierają, będą musieli mieć swoje punkty zresetowane do 0.
Musisz uzyskać model Character dla użytkownika, aby wykryć, kiedy umarli. Ten model jest dodawany do doświadczenia po załadowaniu obiektu Player i możesz użyć zdarzenia CharacterAdded, aby nasłuchiwać, kiedy postać jest gotowa do użycia. Stwórz funkcję o nazwie onCharacterAdded z dwoma parametrami: jednym dla postaci, drugim dla gracza.
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
Chociaż included użytkownika w parametrach funkcji onCharacterAdded, faktyczne zdarzenie CharacterAdded zwraca tylko postać, nie powiązanego użytkownika. Aby przekazać obiekt player, możesz użyć funkcji anonimowej do połączenia zdarzenia.
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)
end
Resetuj punkty
Kiedy użytkownik umiera, ich Humanoid automatycznie wywołuje zdarzenie Died. Możesz użyć tego zdarzenia, aby dowiedzieć się, kiedy zresetować ich punkty.
Humanoid znajduje się w modelu Character, ale zawartość tego modelu jest składana dopiero po odrodzeniu użytkownika. Aby twój kod mógł bezpiecznie czekać na załadowanie obiektu Humanoid, użyj funkcji WaitForChild(). Możesz ją wywołać na dowolnym obiekcie rodzicielskim, przekazując nazwę łańcucha obiektu, na który czekasz. Utwórz zmienną, aby czekać na Humanoid za pomocą character:WaitForChild("Humanoid").
local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
end
Funkcja, którą musisz połączyć ze zdarzeniem Died, jest bardzo krótka i będzie potrzebna tylko tutaj, więc możesz znowu użyć funkcji anonimowej.
- Połącz nową funkcję anonimową z zdarzeniem Died Humanoida.
- W funkcji anonimowej stwórz zmienną o nazwie points dla obiektu Points gracza.
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)
end
Przetestuj to i zobaczysz, że wynik użytkownika zostaje zresetowany, kiedy umiera.
Sprawdź gracza
Jeśli użytkownicy będą zdobywać punkty, nawet gdy są martwi, to nie jest w duchu doświadczenia, więc kod musi sprawdzić, czy użytkownicy są żywi, zanim przyzna punkt.
Musisz zacząć od zdefiniowania atrybutu w funkcji onPlayerAdded, który można wykorzystać do sprawdzenia, czy użytkownik jest żywy. W tym momencie użytkownik nie jest jeszcze żywy i odrodzony, ponieważ ich model postaci wciąż musi być dodany.
Atrybuty pozwalają dostosować obiekty w Roblox do własnych danych. Atrybut składa się z nazwy i wartości. Możesz stworzyć jeden na dowolnym obiekcie używając funkcji SetAttribute. Wywołaj SetAttribute na player, aby stworzyć nowy atrybut o nazwie "IsAlive" z wartością false.
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
Gdy model postaci użytkownika się odrodzi, wartość IsAlive musi zostać zmieniona na true, aby użytkownik mógł na nowo zdobywać punkty.
- W onCharacterAdded, ustaw atrybut IsAlive gracza na true.
- W onCharacterDied, ustaw atrybut IsAlive gracza na 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)
end
Na końcu atrybut IsAlive powinien być sprawdzany przed przyznaniem jakiegokolwiek punktu w pętli while na końcu skryptu. Funkcja GetAttribute przyjmuje nazwę atrybutu i zwraca jego wartość. W pętli while, otocz kod przyznający punkt w instrukcji if z warunkiem player:GetAttribute("IsAlive").
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList dolocal player = playerList[currentPlayer]if player:GetAttribute("IsAlive") thenlocal points = player.leaderstats.Pointspoints.Value += 1endendend
Przetestuj swoje doświadczenie, a powinieneś zauważyć, że użytkownik zdobywa punkty co sekundę, gdy jest żywy, a punkty pozostają na 0, gdy ich nie ma. Pozwól swoim przyjaciołom grać z tobą i zobacz, kto zdobędzie najwyższy wynik.
To dopiero początek: możesz kontynuować poprawę swojego doświadczenia dla użytkowników. Oto kilka wskazówek:
- Umieść kod dla wszystkich platform w jednym skrypcie, co znacznie ułatwi aktualizację.
- Stwórz obszar lobby, w którym użytkownicy będą czekać na teleportację do obszaru doświadczeń, umożliwiając równoczesne rozpoczęcie gry.
- Ogłoś zwycięzców każdej rundy.
Końcowy kod
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