得分點

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

在以前的教學中,您提供了各種體驗功能,包括 漸漸消失的平台 和 致命的岩漿。這個教學將這些體驗結合成一個可以玩的體驗,用戶在存活最長時間的人看到誰能存活最長時間。每秒存活下來,一分將被添加到他們的分數。

設置

首先,您需要設置您的體驗。重複您在前一個教學中所做的 漸漸消失的平台,並讓用戶競爭在平台板上存留的時間盡可能長。

您也可以使用 致命的岩漿 來殺死用戶當他們從平台上掉下時,或者只是讓他們掉下去到他們的命運。請務必你放置 SpawnLocation 在用戶可以跳上平台開始遊戲的地方。

玩家點數

Roblox 有內置 排行榜 可顯示玩家統計資料。當您通過排行榜設置玩家點數時,它們會顯示在畫面的右邊。

Leaderboard with username and points shown

您將在後面的教學中學會更自訂顯示信息的方法,但排行榜是在 Roblox 中建立可見得分系統的最簡單方法。

最好將設定體驗狀態的指令放入 ServerScriptService ,因為它們會在體驗開始時自動執行。在 ServerScriptService 中,建立名為 SetupPoints 的指令。

SetupPoints script in place in ServerScriptService in the Explorer window

聆聽玩家

在 Roblox 中,服務是一個對行使各種有用功能的對象。Players服務有一個名為 PlayerAdded 的事件,您可以使用它來為每個加入體驗的用戶設置點數。

您可以使用 GetService 對象中的 game 功能來存取物件務。 game 是一個可以從任何地方存取的變量,其中包含您的體驗。

  1. 使用 game:GetService("Players") 建立玩家服務的變數。

  2. 建立名為 onPlayerAdded 的函數,並且為接收玩家設定參數。

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


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

創建資料欄

要在排行榜上顯示用戶的點數,您需要做的唯一是創建新的 Folder 在他們的 Player 對象上,並將他們的點數放入。新對象可以從 "leaderstats" 函數內的內部指定建立。

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


    local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    end
  2. leaderstats 的名稱設為 "leaderstats"

  3. 父親 leaderstatsplayer


    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. 在指定條指令碼為 true 的情況下,在指定的 while 內建立一個 1> while1> 循環。
  2. 在循環中,task.wait(),為 1 秒。

Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
end

玩家列表

要為每個用戶在體驗中執行代碼,您需要在 Class.Players:GetPlayers()|GetPlayers 函數的返回列表中 GetPlayers

陣列是存放在順序的項目列表。每個項目可以通過它的 索引 位置存取,從 1 開始。你可以使用前缀它的 # 來取得陣列的長度。

  1. Players:GetPlayers() 的結果存儲在 playerList 變量中。
  2. 以 1 的起始值和 #playerList 的終止值來創建一個 for 循環,讓您每個玩家獲得一個循環的一次。

while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- 在玩家列表中的每個玩家添加您的逻辑
end
end

獎勵點數

要在 for 循環中給每個用戶分配點數,您需要將用戶從陣列中取出並將 1 添加到 點數 對象,存放在他們的 leaderstats 資料夾中。

在陣列中儲存的對象使用 圓括號 來存取 - 例個體、實例, playerList 陣列中的第一個項目可以使用 playerList[1)] 。如果您在 for 循環中寫入 1>playerList[currentPlayer]1> ,您可以在每個用戶中 4>playerList[iterate

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

您需要檢查使用者是否死亡,這個模型只在體驗中添加後才會顯示。這個模型只在體驗上顯示後 Class.Player 對象載入後,您才可以使用 Class.Player.CharacterAdded|CharacterAdded 事件來�����


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

雖然您在 onCharacterAdded 函數的參數中包含用戶,但實際 CharacterAdded 事件只返回角色,不是屬性用戶。要將 player 對象作為通行資格,請使用 1>匿名函數1> 為事件連接。


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 事件。您可以使用此事件來確認重設時間。

人形在角色模型中找到,但該模型中的內容只有在用戶重新生成時才會被組合。要使您的代碼安全地等待人形對象載入,請使用 WaitForChild() 函數。您可以將它稱為任何父對物件,並將 character:WaitForChild("Humanoid")


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

連接死亡事件的函數非常簡短,只會在此需要,因此您可以再次使用匿名函數。

  1. 連接新的匿名函數到人形的 死亡 事件。
  2. 在匿名函數中,創建名為 points 的變數,為玩家的 點數 對物件。
  3. Value 屬性的 points 設為 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 函數在任何對象上創建新的 屬


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 中,將 IsAlive 屬性的 player 設置為 1> 真1>。
  2. onCharacterDied 中,將 IsAlive 屬性的 player 設為 1> false1>。

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

最後,IsAlive 應該在指定的 玩家layer:GetAttribute("而且) 後,才能在指定的while 循環中獲得點數。1> Class.Instance:GetAttribute()|


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