在以前的教學中,您提供了各種體驗功能,包括 漸漸消失的平台 和 致命的岩漿。這個教學將這些體驗結合成一個可以玩的體驗,用戶在存活最長時間的人看到誰能存活最長時間。每秒存活下來,一分將被添加到他們的分數。
設置
首先,您需要設置您的體驗。重複您在前一個教學中所做的 漸漸消失的平台,並讓用戶競爭在平台板上存留的時間盡可能長。
您也可以使用 致命的岩漿 來殺死用戶當他們從平台上掉下時,或者只是讓他們掉下去到他們的命運。請務必你放置 SpawnLocation 在用戶可以跳上平台開始遊戲的地方。
玩家點數
Roblox 有內置 排行榜 可顯示玩家統計資料。當您通過排行榜設置玩家點數時,它們會顯示在畫面的右邊。
您將在後面的教學中學會更自訂顯示信息的方法,但排行榜是在 Roblox 中建立可見得分系統的最簡單方法。
最好將設定體驗狀態的指令放入 ServerScriptService ,因為它們會在體驗開始時自動執行。在 ServerScriptService 中,建立名為 SetupPoints 的指令。
聆聽玩家
在 Roblox 中,服務是一個對行使各種有用功能的對象。Players服務有一個名為 PlayerAdded 的事件,您可以使用它來為每個加入體驗的用戶設置點數。
您可以使用 GetService 對象中的 game 功能來存取物件務。 game 是一個可以從任何地方存取的變量,其中包含您的體驗。
使用 game:GetService("Players") 建立玩家服務的變數。
建立名為 onPlayerAdded 的函數,並且為接收玩家設定參數。
連接 onPlayerAdded 函數到 PlayerAdded 事件。
local Players = game:GetService("Players")local function onPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)
創建資料欄
要在排行榜上顯示用戶的點數,您需要做的唯一是創建新的 Folder 在他們的 Player 對象上,並將他們的點數放入。新對象可以從 "leaderstats" 函數內的內部指定建立。
使用 Folder 創建新的 Instance.new("Folder") 對象,並將結果存儲在新變量中,名為 leaderstats。
local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")end將 leaderstats 的名稱設為 "leaderstats"。
父親 leaderstats 至 player。
local Players = game:GetService("Players")local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = playerendPlayers.PlayerAdded:Connect(onPlayerAdded)
創建點
排行榜系統閱取 leaderstats 資料夾中的任何值,並且顯示找到的任何值。
要添加追蹤玩家點數的新統計資料,請新增一個 IntValue 對象,這個對象可以與 leaderstats 資料夾中的子資料夾顯示。值對象的名稱會在其當前值旁邊顯示。
- 將 Name 設為 "Points"。
- 將 Value 設為 0 ;這是玩家最初會顯示的排行榜。
- 將 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() 函數可以用來更新點數的值每秒。
- 在指定條指令碼為 true 的情況下,在指定的 while 內建立一個 1> while1> 循環。
- 在循環中,task.wait(),為 1 秒。
Players.PlayerAdded:Connect(onPlayerAdded)while true dotask.wait(1)end
玩家列表
要為每個用戶在體驗中執行代碼,您需要在 Class.Players:GetPlayers()|GetPlayers 函數的返回列表中 GetPlayers 。
陣列是存放在順序的項目列表。每個項目可以通過它的 索引 位置存取,從 1 開始。你可以使用前缀它的 # 來取得陣列的長度。
- 將 Players:GetPlayers() 的結果存儲在 playerList 變量中。
- 以 1 的起始值和 #playerList 的終止值來創建一個 for 循環,讓您每個玩家獲得一個循環的一次。
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList do-- 在玩家列表中的每個玩家添加您的逻辑endend
獎勵點數
要在 for 循環中給每個用戶分配點數,您需要將用戶從陣列中取出並將 1 添加到 點數 對象,存放在他們的 leaderstats 資料夾中。
在陣列中儲存的對象使用 圓括號 來存取 - 例個體、實例, playerList 陣列中的第一個項目可以使用 playerList[1)] 。如果您在 for 循環中寫入 1>playerList[currentPlayer]1> ,您可以在每個用戶中 4>playerList[iterate
- 將用戶存取在 playerList[currentPlayer] 變數中的變數名為 player 。
- 將用戶的 點數 對象存放在變數名為 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
測試您的體驗,您應該發現排行榜上的玩家每秒鐘都會提升 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
連接死亡事件的函數非常簡短,只會在此需要,因此您可以再次使用匿名函數。
- 連接新的匿名函數到人形的 死亡 事件。
- 在匿名函數中,創建名為 points 的變數,為玩家的 點數 對物件。
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,以便使用者可以再次獲得點數。
- 在 onCharacterAdded 中,將 IsAlive 屬性的 player 設置為 1> 真1>。
- 在 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 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
現在測試您的體驗,您應該找到用戶每次活著時獲得點數,並且在不活著時保持在 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