計分

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

在之前的教程中,您製作了各種遊戲功能,包括 漸變平台致命熔岩。本教程將這些功能結合在一起,形成一個可玩的遊戲,讓用戶看看誰能活得最久。每當他們存活一秒鐘,將會為他們的分數增加一分。

設置

首先,您需要為您的遊戲設置場景。複製您在之前教程中製作的 漸變平台,讓用戶競爭在平台上停留的時間。

您還可以使用 致命熔岩 來殺死當他們從平台上掉下來的用戶,或者讓他們直接掉入死亡之中。確保您在某個地方放置一個 SpawnLocation,讓用戶可以跳上平台開始遊戲。

在熔岩地面上方的漸變平台網格上方的生成點

玩家分數

Roblox 有一個內建的 Leaderboard 用於顯示用戶統計數據。當您通過排行榜設置玩家分數時,它們會顯示在遊戲屏幕的右側。

顯示用戶名和分數的排行榜

您將在後面的教程中學習更多可自定義的顯示信息的方法,但排行榜是 Roblox 中製作可見計分系統的最簡單方法。

最好將設置遊戲狀態的腳本放入 ServerScriptService 中,因為它們會在遊戲開始時自動運行。在 ServerScriptService 中,創建一個名為 SetupPoints 的腳本。

Explorer 窗口中 ServerScriptService 中的 SetupPoints 腳本

監聽玩家

在 Roblox 中,服務 是執行一系列有用功能的對象。Players 服務有一個名為 PlayerAdded 的事件,您可以用來為每個加入遊戲的用戶設置分數。

您可以使用 GetService 函數在 game 對象中訪問服務。game 是一個可以從任何地方訪問的變量,包含您遊戲中的所有內容。

  1. 使用 game:GetService("Players") 創建一個 Players 服務的變量。

  2. 創建一個名為 onPlayerAdded 的函數,並為進入的玩家設置一個參數。

  3. onPlayerAdded 函數連接到 PlayerAdded 事件。

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

創建統計資料文件夾

要使用戶的分數顯示在排行榜中,您只需在他們的 Player 對象中創建一個名為 "leaderstats" 的新 Folder,並將他們的分數放在那裡。可以通過 Instance.new() 函數在腳本中創建新對象。

  1. 使用 Instance.new("Folder") 創建一個新的 Folder 對象,並將結果存儲在一個名為 leaderstats 的新變量中。

    local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    end
  2. leaderstats 的 Name 屬性設置為 "leaderstats"

  3. leaderstats 的父級設置為 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)

創建分數

排行榜系統會讀取 leaderstats 文件夾中的任何值並顯示它找到的內容。

要添加一個跟蹤玩家分數的統計數據,可以將一個新的 IntValue 對象作為父級添加到 leaderstats 文件夾中。值對象的名稱將與其當前值一起顯示。

  1. 使用名為 points 的變量創建一個新的 IntValue 對象,使用 Instance.new()
  2. Name 設置為 "Points"
  3. Value 設置為 0;這是排行榜最初顯示給玩家的內容。
  4. points 對象作為父級添加到 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)

測試您的遊戲,您應該會看到排行榜在右上角顯示用戶的名稱和旁邊的分數。

計算時間

每個用戶應該為他們存活的每一秒獲得一分。可以使用 while 循環和 task.wait() 函數每秒更新一次分數值。

  1. 在腳本的末尾,創建一個 while 循環,條件為 true
  2. 在循環中,task.wait() 等待 1 秒。
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
end

玩家列表

要為遊戲中的每個用戶運行代碼,您需要遍歷 GetPlayers 函數返回的 數組

數組是按順序存儲的項目列表。每個項目可以通過其 索引 位置訪問,從 1 開始。您可以通過在數組前加上 # 來獲取數組的長度。

  1. Players:GetPlayers() 的結果存儲在 playerList 變量中。
  2. 創建一個 for 循環,起始值為 1,結束值為 #playerList,這樣您就可以為每個玩家獲得一次循環。
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- 在這裡為 playerList 中的每個玩家添加您的邏輯
end
end

獎勵分數

要在 for 循環中為每個用戶獎勵一分,您需要從數組中獲取用戶並將 1 加到他們的 Points 對象中。

存儲在數組中的對象使用 方括號 訪問 - 例如,playerList 數組中的第一個項目可以使用 playerList[1] 訪問。如果您在 for 循環中寫 playerList[currentPlayer],您可以在每次循環中遍歷列表中的每個用戶。

  1. playerList[currentPlayer] 中的用戶存儲在名為 player 的變量中。
  2. 將用戶的 Points 對象存儲在名為 points 的變量中。
  3. Value 屬性設置為 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

測試您的遊戲,您應該會發現排行榜顯示玩家的分數每秒增加 1。

監聽角色

遊戲的目標是看看誰能活得最久,因此死去的用戶需要將他們的分數重置為 0。

您需要獲取用戶的 Character 模型,以便檢測他們何時死亡。該模型僅在 Player 對象加載後添加到遊戲中,您可以使用 CharacterAdded 事件來監聽角色何時準備好使用。創建一個名為 onCharacterAdded 的函數,帶有兩個參數:一個是角色,一個是玩家。

local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")

雖然您在 onCharacterAdded 函數的參數中包含了用戶,但實際的 CharacterAdded 事件僅返回角色,而不返回相關的用戶。要同時傳遞 player 對象,可以為事件連接使用 匿名函數

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

重置分數

當用戶死亡時,他們的 Humanoid 會自動觸發 Died 事件。您可以使用此事件來確定何時重置他們的分數。

Humanoid 位於 Character 模型中,但該模型的內容僅在用戶生成時組裝。為了安全地等待 Humanoid 對象加載,請使用 WaitForChild() 函數。您可以在任何父對象上調用它,傳遞您正在等待的子對象的字符串名稱。使用 character:WaitForChild("Humanoid") 創建一個變量以等待 Humanoid。

local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
end

您需要連接到 Died 事件的函數非常簡短,並且只在這裡需要,因此您可以再次使用匿名函數。

  1. 將一個新的匿名函數連接到 Humanoid 的 Died 事件。
  2. 在匿名函數中,為玩家的 Points 對象創建一個名為 points 的變量。
  3. Value 屬性設置為 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

測試一下,您會看到用戶的分數在他們死亡時重置。

檢查玩家

如果用戶在死亡時仍然獲得分數,這顯然不符合遊戲的精神,因此代碼需要在獎勵分數之前檢查用戶是否仍然活著。

您需要首先在 onPlayerAdded 函數中定義一個 屬性,以便檢查用戶是否活著。此時,用戶尚未活著並生成,因為他們的角色模型仍需添加。

屬性允許您使用自己的數據自定義 Roblox 中的對象。屬性由名稱和值組成。您可以使用 SetAttribute 函數在任何對象上創建一個。對 player 調用 SetAttribute 以創建一個名為 "IsAlive" 的新 屬性,其值為 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

一旦用戶的角色模型重生,IsAlive 的值需要更改為 true,以便用戶可以再次開始獲得分數。

  1. onCharacterAdded 中,將 playerIsAlive 屬性設置為 true
  2. onCharacterDied 中,將 playerIsAlive 屬性設置為 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

最後,在腳本末尾的 while 循環中應該 檢查 IsAlive,以便在獎勵任何分數之前。GetAttribute 函數接受屬性的名稱並返回其值。在 while 循環中,將獎勵分數的代碼包裹在一個 if 語句中,條件為 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

現在測試您的遊戲,您應該會發現用戶在存活的每一秒都會獲得分數,而在不存活時則保持在 0。讓您的朋友和您一起玩,看看誰能獲得最高分。

這僅僅是開始:您可以繼續改善您的遊戲以供用戶使用。以下是一些提示:

  • 將所有平台的代碼放入一個腳本中,使其更容易更新。
  • 創建一個大廳區域,讓用戶等待被傳送到遊戲區域,讓用戶可以同時開始。
  • 宣布每輪的獲勝者。

最終代碼

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、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。