评分标准

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

在以前的教程中,您使用了各种体验功能,例如 渐渐消失的平台 和 危险的岩浆。 此教程将这些体验组合成一个可玩的体验,用户在活着最长时间的人看到谁可以活下来。 每秒钟存活下来,一个积分将被添加到他们的分数。

设置

首先,您需要将场景设置为您的体验。 重复在 渐变平台 上您在以前的教程中制作的内容,让用户在平台板上尽可能长时间保持。

您还可以使用 致命的岩浆 来杀死用户当他们从平台上掉下时,或者只是让他们落下到他们的命运。请确保您放置一个 SpawnLocation 在平台上的任何地方,用户可以跳上平台开始玩。

玩家点数

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

Leaderboard with username and points shown

您将在后面的教程中学习更多可定制的方法显示信息,但排行榜是 Roblox 中最简单的方法来创建可见的评分系统。

最好将设置体验状态的脚本放入 服务器脚本服务 ,因为它们将在体验开始时自动运行。在 服务器脚本服务 中,创建一个名为 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. 在脚本结束时,创建一个 while 循环,其中 true 作为条件。
  2. 在循环中,task.wait(),为 1 秒。

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

玩家列表

要为体验中的每个用户运行代码,您需要通过 Class.Players:GetPlayers()|GetPlayers 函数返回的用户阵列来反复运行。

阵列是存储在顺序的物品列表。每个物品都可以通过其 索引 位置访问,从 1 开始。你可以通过将其前缀为 # 来获得阵列的长度。

  1. 将结果存储在 Players:GetPlayers() 变量中。
  2. 创建一个 for 循环,起始值 1 和终止值 #playerList ,以便您每个玩家获得一次循环。

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

奖励积分

要将点数奖励给每个用户在循环中,您需要将用户从阵列中取出,并将 1 添加到 积分 对象,存储在他们的 leaderstats 文件夹中。

存储在阵列中的对象使用 方形括号 - 例实例, playerList 阵列中的第一个项目可以使用 playerList[1)] 。如果您在 for 循环中写入 1>playerList[currentPlayer]1> ,您可以在每个用户中循环通过每个回合。

  1. 用变量 playerList[currentPlayer] 存储用户。
  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.CharacterAdded|CharacterAdded 事件来列出角色准备使用时间。创建一个名为 onCharacter


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> ,请使用一个 4>匿名函数4> 为事件连接。


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() 函数。您可以在任何父对象上调用它,并将子对象的字符名传递给父对象。创建变量以等待人形对象加


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 函数创建一个新的 SetAttribute 被称为 2> IsAlive2> 。


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 应该在脚本结束时的 while 循环中的任何时点前被检查。while 函数的名称取决于属性,并将返回


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 ,当不活着时保持在 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