得分

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

在之前的教程中,您制作了各种游戏功能,包括 渐变平台致命熔岩。本教程将这些功能结合在一起,形成一个可玩游戏,用户可以看到谁能活得最久。每当他们存活一秒,就会为他们的得分增加一分。

设置

首先,您需要为您的游戏设置场景。复制您在之前教程中制作的 渐变平台,让用户竞争尽可能长时间地留在平台上。

您还可以使用 致命熔岩 来杀死从平台上掉下来的用户,或者让他们直接坠落。确保您在某个地方放置一个 SpawnLocation,以便用户可以跳到平台上开始游戏。

在熔岩地面上方的渐变平台网格上方的生成点

玩家积分

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

显示用户名和积分的排行榜

您将在后面的教程中学习更多可自定义的显示信息的方法,但排行榜是 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. 在脚本的末尾,创建一个条件为 truewhile 循环。
  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 循环中为每个用户奖励一分,您需要从数组中获取用户并将 Points 对象的值加 1。

存储在数组中的对象使用 方括号 访问 - 例如,playerList 数组中的第一个项目可以通过 playerList[1] 访问。如果您在 for 循环中写 playerList[currentPlayer],您可以在每次循环迭代中遍历列表中的每个用户。

  1. playerList[currentPlayer] 中的用户存储在名为 player 的变量中。
  2. 将用户的 Points 对象存储在名为 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。

您需要获取用户的 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 属性的 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 函数在任何对象上创建一个。调用 SetAttributeplayer 上创建一个名为 "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 是我们在美国及其他国家或地区的注册与未注册商标。