Zdobywanie punktów

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

W poprzednich samouczkach stworzyłeś różnorodne funkcje gry, w tym znikające platformy i śmiertelną lawę. Ten samouczek łączy je w grywalną grę, w której użytkownicy zobaczą, kto potrafi przetrwać najdłużej. Za każdą sekundę, którą spędzą przy życiu, do ich wyniku zostanie dodany punkt.

Ustawienia

Na początek musisz ustawić scenę dla swojej gry. Skopiuj znikające platformy, które stworzyłeś w poprzednim samouczku, i pozwól użytkownikom rywalizować, aby jak najdłużej pozostać na planszy platform.

Możesz również użyć śmiertelnej lawy, aby zabić użytkowników, gdy spadną z platform, lub po prostu pozwolić im spaść na ich zgubę. Upewnij się, że umieścisz SpawnLocation w miejscu, gdzie użytkownicy mogą skakać na platformy, aby rozpocząć grę.

Punkt respawnu nad siatką znikających platform, nad lawowym podłożem

Punkty gracza

Roblox ma wbudowany Leaderboard do wyświetlania statystyk użytkowników. Gdy ustawisz punkty gracza za pomocą leaderboarda, pojawią się one po prawej stronie ekranu w grze.

Leaderboard z nazwą użytkownika i wyświetlonymi punktami

W późniejszych samouczkach dowiesz się o bardziej konfigurowalnych sposobach wyświetlania informacji, ale leaderboard to najprostszy sposób na stworzenie widocznego systemu punktacji w Robloxie.

Najlepiej umieścić skrypty, które ustawiają stan gry, w ServerScriptService, ponieważ będą one automatycznie uruchamiane, gdy gra się rozpocznie. W ServerScriptService stwórz skrypt o nazwie SetupPoints.

Skrypt SetupPoints w ServerScriptService w oknie Eksploratora

Nasłuchuj graczy

W Robloxie usługa to obiekt, który wykonuje szereg użytecznych funkcji. Usługa Players ma zdarzenie o nazwie PlayerAdded, które możesz wykorzystać do ustawienia punktów dla każdego użytkownika, który dołącza do gry.

Możesz uzyskać dostęp do usług za pomocą funkcji GetService w obiekcie game. game to zmienna dostępna z dowolnego miejsca, która zawiera wszystko w twojej grze.

  1. Utwórz zmienną dla usługi Graczy, używając game:GetService("Players").

  2. Utwórz funkcję o nazwie onPlayerAdded z parametrem dla nadchodzącego gracza.

  3. Połącz funkcję onPlayerAdded z zdarzeniem PlayerAdded.

    local Players = game:GetService("Players")
    local function onPlayerAdded(player)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)

Utwórz folder statystyk

Aby punkty użytkownika były wyświetlane w leaderboardzie, wystarczy utworzyć nowy Folder w obiekcie Player o nazwie "leaderstats" i umieścić w nim ich punkty. Nowe obiekty można tworzyć w skrypcie za pomocą funkcji Instance.new().

  1. Utwórz nowy obiekt Folder używając Instance.new("Folder"), przechowując wynik w nowej zmiennej o nazwie leaderstats.

    local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    end
  2. Ustaw właściwość Name leaderstats na "leaderstats".

  3. Ustaw leaderstats jako rodzica player.

    local Players = game:GetService("Players")
    local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    end
    Players.PlayerAdded:Connect(onPlayerAdded)

Utwórz punkty

System leaderboarda odczytuje wszelkie wartości w folderze leaderstats i wyświetla wszystko, 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 aktualnej wartości.

  1. Użyj zmiennej o nazwie points, aby utworzyć nowy obiekt IntValue za pomocą Instance.new().
  2. Ustaw Name na "Points".
  3. Ustaw Value na 0; to jest to, co leaderboard początkowo wyświetli dla gracza.
  4. Ustaw obiekt points jako rodzica folderu 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 swoją grę, a powinieneś zobaczyć leaderboard pojawiający się w prawym górnym rogu z nazwami twoich użytkowników i wynikiem punktowym obok nich.

Licz czas

Każdy użytkownik powinien zdobywać punkt za każdą sekundę, którą spędza przy życiu. Pętla while i funkcja task.wait() mogą być użyte do aktualizacji wartości punktów co sekundę.

  1. Na końcu skryptu utwórz pętlę while z true jako warunkiem.
  2. W pętli, task.wait() na 1 sekundę.
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
end

Lista graczy

Aby uruchomić kod dla każdego użytkownika w grze, musisz iterować przez tablicę użytkowników zwróconą przez funkcję GetPlayers.

Tablica to lista elementów przechowywanych w kolejności. Każdy element można uzyskać za pomocą jego indeksu, zaczynając od 1. Możesz uzyskać długość tablicy, poprzedzając ją #.

  1. Przechowaj wynik Players:GetPlayers() w zmiennej playerList.
  2. Utwórz pętlę for z wartością początkową 1 i wartością końcową #playerList, aby uzyskać jedną iterację pętli dla każdego gracza.
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- Dodaj swoją logikę tutaj dla każdego gracza w playerList
end
end

Przyznawanie punktów

Aby przyznać punkt każdemu użytkownikowi w pętli for, musisz wydobyć 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 w pętli for napiszesz playerList[currentPlayer], możesz przechodzić przez każdego użytkownika na liście z każdą iteracją pętli.

  1. Przechowaj użytkownika w playerList[currentPlayer] w zmiennej o nazwie player.
  2. Przechowaj obiekt Points użytkownika w zmiennej o nazwie points.
  3. Ustaw właściwość Value obiektu points na points.Value + 1.
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
end

Przetestuj swoją grę, a powinieneś zauważyć, że leaderboard pokazuje wynik twojego gracza rosnący o 1 co sekundę.

Nasłuchuj postaci

Celem gry jest zobaczenie, kto potrafi przetrwać 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 umarł. Ten model jest dodawany do gry po załadowaniu obiektu Player, a możesz użyć zdarzenia CharacterAdded, aby nasłuchiwać, kiedy postać jest gotowa do użycia. Utwó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ż uwzględniłeś użytkownika w parametrach funkcji onCharacterAdded, rzeczywiste zdarzenie CharacterAdded zwraca tylko postać, a nie powiązanego użytkownika. Aby przekazać obiekt player, użyj 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

Resetowanie punktów

Gdy użytkownik umiera, jego Humanoid automatycznie wywołuje zdarzenie Died. Możesz użyć tego zdarzenia, aby dowiedzieć się, kiedy zresetować ich punkty.

Humanoid znajduje się wewnątrz modelu Character, ale zawartość tego modelu jest składana tylko wtedy, gdy użytkownik się respawnuje. Aby bezpiecznie poczekać na załadowanie obiektu Humanoid, użyj funkcji WaitForChild(). Możesz ją wywołać na dowolnym obiekcie rodzica, przekazując nazwę ciągu dziecka, na które czekasz. Utwórz zmienną, aby poczekać na Humanoida, używając 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ć z zdarzeniem Died, jest bardzo krótka i będzie potrzebna tylko tutaj, więc możesz ponownie użyć funkcji anonimowej.

  1. Połącz nową funkcję anonimową z zdarzeniem Died Humanoida.
  2. W funkcji anonimowej utwórz zmienną o nazwie points dla obiektu Points gracza.
  3. Ustaw właściwość Value obiektu points na 0.
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, a zobaczysz, że wynik użytkownika resetuje się, gdy umiera.

Sprawdź gracza

Jeśli użytkownicy nadal zdobywają punkty, nawet gdy są martwi, to nie jest w duchu gry, więc kod musi sprawdzić, czy użytkownicy są żywi przed przyznaniem punktu.

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 nie został dodany, ponieważ ich model postaci wciąż musi być dodany.

Atrybuty pozwalają na dostosowanie obiektów w Robloxie za pomocą własnych danych. Atrybut składa się z nazwy i wartości. Możesz utworzyć jeden na dowolnym obiekcie, używając funkcji SetAttribute. Wywołaj SetAttribute na player, aby utworzyć 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ę respawnuje, wartość IsAlive musi zostać zmieniona na true, aby użytkownik mógł ponownie zdobywać punkty.

  1. W onCharacterAdded ustaw atrybut IsAlive gracza na true.
  2. 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 koniec, IsAlive powinno być sprawdzane przed przyznaniem jakiegokolwiek punktu w pętli while na końcu skryptu. Funkcja GetAttribute przyjmuje nazwę atrybutu i zwraca wartość. W pętli while owiń kod przyznający punkt w instrukcji if z warunkiem 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
end

Przetestuj teraz swoją grę, a powinieneś zauważyć, że użytkownik zdobywa punkty co sekundę, gdy jest żywy, a pozostaje na 0, gdy nie żyje. Niech twoi przyjaciele zagrają z tobą i zobaczą, kto zdobędzie najwyższy wynik.

To dopiero początek: możesz kontynuować ulepszanie swojej gry 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 gry, pozwalając użytkownikom rozpocząć jednocześnie.
  • Ogłaszaj zwycięzców każdej rundy.

Ostateczny 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
©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.