在以前的教程中,您使用了各种体验功能,例如 渐渐消失的平台 和 危险的岩浆。 此教程将这些体验组合成一个可玩的体验,用户在活着最长时间的人看到谁可以活下来。 每秒钟存活下来,一个积分将被添加到他们的分数。
设置
首先,您需要将场景设置为您的体验。 重复在 渐变平台 上您在以前的教程中制作的内容,让用户在平台板上尽可能长时间保持。
您还可以使用 致命的岩浆 来杀死用户当他们从平台上掉下时,或者只是让他们落下到他们的命运。请确保您放置一个 SpawnLocation 在平台上的任何地方,用户可以跳上平台开始玩。
玩家点数
Roblox 有一个内置的 排行榜 用于显示用户统计。当您通过排行榜设置玩家积分时,它们会显示在屏幕的右侧。
您将在后面的教程中学习更多可定制的方法显示信息,但排行榜是 Roblox 中最简单的方法来创建可见的评分系统。
最好将设置体验状态的脚本放入 服务器脚本服务 ,因为它们将在体验开始时自动运行。在 服务器脚本服务 中,创建一个名为 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() 函数可以用来每秒钟更新积分值。
- 在脚本结束时,创建一个 while 循环,其中 true 作为条件。
- 在循环中,task.wait(),为 1 秒。
Players.PlayerAdded:Connect(onPlayerAdded)while true dotask.wait(1)end
玩家列表
要为体验中的每个用户运行代码,您需要通过 Class.Players:GetPlayers()|GetPlayers 函数返回的用户阵列来反复运行。
阵列是存储在顺序的物品列表。每个物品都可以通过其 索引 位置访问,从 1 开始。你可以通过将其前缀为 # 来获得阵列的长度。
- 将结果存储在 Players:GetPlayers() 变量中。
- 创建一个 for 循环,起始值 1 和终止值 #playerList ,以便您每个玩家获得一次循环。
while true dotask.wait(1)local playerList = Players:GetPlayers()for currentPlayer = 1, #playerList do-- 为玩家List 中的每个玩家添加您的逻辑endend
奖励积分
要将点数奖励给每个用户在循环中,您需要将用户从阵列中取出,并将 1 添加到 积分 对象,存储在他们的 leaderstats 文件夹中。
存储在阵列中的对象使用 方形括号 - 例实例, playerList 阵列中的第一个项目可以使用 playerList[1)] 。如果您在 for 循环中写入 1>playerList[currentPlayer]1> ,您可以在每个用户中循环通过每个回合。
- 用变量 playerList[currentPlayer] 存储用户。
- 将用户的 积分 对象存储在变量中,称为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.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
您需要连接到死亡事件的函数很短,它只会在此需要,因此您可以再次使用一个匿名函数。
- 将一个新的匿名函数连接到人形的 死亡事件 。
- 在匿名函数中,创建一个名为 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 被称为 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,以便用户可以再次获得积分。
- 在 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 应该在脚本结束时的 while 循环中的任何时点前被检查。while 函数的名称取决于属性,并将返回
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 ,当不活着时保持在 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