在之前的教程中,您制作了各种游戏功能,包括 渐变平台 和 致命熔岩。本教程将这些功能结合在一起,形成一个可玩游戏,用户可以看到谁能活得最久。每当他们存活一秒,就会为他们的得分增加一分。
设置
首先,您需要为您的游戏设置场景。复制您在之前教程中制作的 渐变平台,让用户竞争尽可能长时间地留在平台上。
您还可以使用 致命熔岩 来杀死从平台上掉下来的用户,或者让他们直接坠落。确保您在某个地方放置一个 SpawnLocation,以便用户可以跳到平台上开始游戏。

玩家积分
Roblox 有一个内置的 排行榜 用于显示用户统计信息。当您通过排行榜设置玩家积分时,它们会显示在游戏屏幕的右侧。

您将在后面的教程中学习更多可自定义的显示信息的方法,但排行榜是 Roblox 中制作可见得分系统的最简单方法。
最好将设置游戏状态的脚本放入 ServerScriptService 中,因为它们会在游戏开始时自动运行。在 ServerScriptService 中,创建一个名为 SetupPoints 的脚本。

监听玩家
在 Roblox 中,服务 是执行一系列有用功能的对象。Players 服务有一个名为 PlayerAdded 的事件,您可以使用它为每个加入游戏的用户设置积分。
您可以通过 GetService 函数在 game 对象中访问服务。game 是一个可以从任何地方访问的变量,包含您游戏中的所有内容。
使用 game:GetService("Players") 创建一个 Players 服务的变量。
创建一个名为 onPlayerAdded 的函数,带有一个参数用于传入的玩家。
将 onPlayerAdded 函数连接到 PlayerAdded 事件。
local Players = game:GetService("Players")local function onPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)
创建统计文件夹
要使用户的积分在排行榜中显示,您只需在他们的 Player 对象中创建一个名为 "leaderstats" 的新 Folder,并将他们的积分放在其中。可以通过 Instance.new() 函数在脚本中创建新对象。
使用 Instance.new("Folder") 创建一个新的 Folder 对象,将结果存储在一个名为 leaderstats 的新变量中。
local function onPlayerAdded(player)local leaderstats = Instance.new("Folder")end将 leaderstats 的 Name 属性设置为 "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 循环。
- 在循环中,task.wait() 1 秒。
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
end玩家列表
要为游戏中的每个用户运行代码,您需要遍历 GetPlayers 函数返回的 数组。
数组是按顺序存储的项目列表。每个项目可以通过其 索引 位置访问,从 1 开始。您可以通过在数组前加上 # 来获取数组的长度。
- 将 Players:GetPlayers() 的结果存储在 playerList 变量中。
- 创建一个 for 循环,起始值为 1,结束值为 #playerList,以便每个玩家进行一次循环迭代。
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- 在这里为 playerList 中的每个玩家添加您的逻辑
end
end奖励积分
要在 for 循环中为每个用户奖励一分,您需要从数组中获取用户并将 Points 对象的值加 1。
存储在数组中的对象使用 方括号 访问 - 例如,playerList 数组中的第一个项目可以通过 playerList[1] 访问。如果您在 for 循环中写 playerList[currentPlayer],您可以在每次循环迭代中遍历列表中的每个用户。
- 将 playerList[currentPlayer] 中的用户存储在名为 player 的变量中。
- 将用户的 Points 对象存储在名为 points 的变量中。
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 事件的函数非常简短,并且只在这里需要,因此您可以再次使用匿名函数。
- 将一个新的匿名函数连接到 Humanoid 的 Died 事件。
- 在匿名函数中,为玩家的 Points 对象创建一个名为 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 函数在任何对象上创建一个。调用 SetAttribute 在 player 上创建一个名为 "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,以便用户可以重新开始获得积分。
- 在 onCharacterAdded 中,将 player 的 IsAlive 属性设置为 true。
- 在 onCharacterDied 中,将 player 的 IsAlive 属性设置为 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