控制结构可以有多个条件。关键字 else 和 elseif 可以为在多个条件下应该发生的事情创建额外的场景。语法如下所示:
if isGreen then
print("前进")
elseif isYellow then
print("慢")
elseif isPedestrians then
print("等待")
else
print("停止")
end在这个项目中,else 和 elseif 被用来编写一个跑酷课程,跑者根据他们的完成时间获得奖励。

编写多个条件的代码
对于这个项目,你可以为每个奖牌编写一个独特的 if 语句来奖励玩家,但这需要很多时间。比如,下面的虚构代码。
if finishTime < 5 then
-- 获得金牌
end
if finishTime >= 5 and <= 10 then
-- 获得银牌
end
if finishTime > 10 and <= 15 then
-- 获得铜牌
end更可读且高效的编码方式是使用一个 if 语句,并使用关键字 elseif 提供替代条件,以测试前面的条件是否不成立。
if finishTime < 5 then
-- 获得金牌
elseif finishTime >= 5 and <= 10 then
-- 获得银牌
elseif finishTime > 10 and <= 15 then
-- 获得铜牌
end当 if/then 语句运行时,它将从顶部开始,并仅运行它找到的 第一个 为真的条件的代码。
设置比赛课程
首先放置课程的起点和终点,然后创建一个脚本来计时玩家并奖励不同的奖牌。
创建一个名为 FinishLine 的固定部件。为了加快测试速度,将起点和终点放得近一些。完成脚本后,你可以移动终点。

终点部分 
整个课程 在 FinishLine 中插入一个名为 RaceManager 的脚本。然后,添加一个变量来存储自比赛开始以来经过的秒数,第二个变量引用 FinishLine。
local finishLine = script.Parentlocal timePassed = 0创建一个名为 finish() 的函数。
local timePassed = 0local finishLine = script.Parentlocal function finish()end自行完成:
- 编写一个名为 partTouched() 的函数,当玩家触碰它时运行 finish()。
- 将终点部分连接到 partTouched()。
- 将你的代码与下面的示例进行比较。
local function finish()print("触碰了终点线")endlocal function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenfinish()endendfinishLine.Touched:Connect(partTouched)进行游戏测试,检查当你触碰终点线时 finish() 是否被调用。
防止 finish() 重复调用
现在,每当玩家触碰终点线时,只要玩家触碰该部分,finish() 就会不断被调用。
使用一个 布尔值,一个存储真或假的变量,以确保 finish() 只被调用一次。
创建一个名为 raceActive 的新变量,并将其设置为 true。
local timePassed = 0local finishLine = script.Parentlocal raceActive = true-- 每当玩家触碰终点线部分时运行local function finish()在 if 语句中添加第二个条件,以检查 raceActive 是否为真,然后再调用 finish()。
local function partTouched(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and raceActive == true thenfinish()endend为了防止 finish() 再次被调用,将 raceActive 设置为 false。
local function finish()print("触碰了终点线")raceActive = falseend进行游戏测试,检查你只看到一次测试打印语句。
跟踪时间
像 if 语句一样,while 循环也可以使用条件来查看是否应该运行。为了计时玩家,使用一个 while true do 循环创建一个计时器,该循环仅在 raceActive 布尔值为真时运行。
在脚本底部,输入 while raceActive == true do。按 Enter 自动完成并添加 end。
finishLine.Touched:Connect(partTouched)while raceActive == true doend为了计时玩家,在循环中每秒将 timePassed 变量加 1。包括一个打印语句来测试你的工作。
finishLine.Touched:Connect(partTouched)while raceActive == true dotask.wait(1)timePassed += 1print(timePassed)end进行游戏测试,检查你是否在 输出 窗口中看到每秒的显示。
奖励玩家奖牌
最后,使用一个带有多个条件的 if 语句,根据玩家的表现奖励他们不同的奖牌。使用一个 if 语句和两个 elseif 语句来检查玩家的完成时间,并奖励他们正确的奖牌。
为了确认每个奖牌可以被授予,使用打印语句。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)end为了奖励金牌,编写一个 if 语句,将 timePassed 与所需的完成时间进行比较。这个示例检查玩家的时间是否小于或等于 10 秒。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)if timePassed <= 10 thenprint("你获得了金牌!")endend进行游戏测试,确认金牌可以被授予。
添加额外条件
现在你已经测试了金牌,使用 elseif 关键字为其他奖牌编写条件。
对于银牌,使用 elseif 和下一个所需的时间范围。在这个示例中,范围是大于 10 秒但小于或等于 20 秒。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)if timePassed <= 10 thenprint("你获得了金牌!")elseif timePassed > 10 and timePassed <= 20 thenprint("你获得了银牌!")endend对于铜牌,使用相同的模式。用下面的示例检查你的代码。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)if timePassed <= 10 thenprint("你获得了金牌!")elseif timePassed > 10 and timePassed <= 20 thenprint("你获得了银牌!")elseif timePassed > 20 and timePassed <= 30 thenprint("你获得了铜牌!")endend进行银牌和铜牌的游戏测试。
故障排除提示
如果你没有看到银牌和铜牌出现,请尝试以下方法之一。
- 每个 elseif 后面都应该有一个 then。
- 在 partTouched() 中,确保 if 语句的第二个条件使用 ==,就像 raceActive == true 一样。
- 检查每个 elseif 是否在作用域内。每个 elseif 条件必须在 if/then 语句的第一行和最后一个 end 之间。
添加 else 条件
如果玩家没有获得任何奖牌,你应该鼓励他们再试一次。在这种情况下,你可以使用一个 else 语句,当 没有其他 条件为真时运行,以向他们显示一条消息。
在最后一个 elseif 下面和 end 之前,开始新的一行并输入 else。不要添加 then。在 else 下面,使用打印语句提示他们再试一次。
local function finish()raceActive = falseprint("你完成的时间是 " .. timePassed)if timePassed <= 10 thenprint("你获得了金牌!")elseif timePassed > 10 and timePassed <= 20 thenprint("你获得了银牌!")elseif timePassed > 20 and timePassed <= 30 thenprint("你获得了铜牌!")elseprint("再试一次!")endend进行游戏测试以查看 else 消息。
总结
控制结构可以有多个场景。使用 if 语句设置要检查的初始语句,然后根据需要添加尽可能多的 elseif 条件。最后,使用 else 来说明如果所有给定条件都为假时应该发生什么。
从顶部开始,所有条件将被检查,只有第一个为真的条件将运行代码。其余条件将不会被检查,也不会运行它们的代码。
完成项目后,你可以扩展脚本以通过几种额外的方式添加新元素。
- 添加代码,以便玩家在完成后通过触碰起点线来重复比赛。
- 设计一种在比赛期间显示时间的方法。你可以使用表面 GUI 在部件上显示时间,就像在 创建定时桥教程 中那样。
local timePassed = 0
local finishLine = script.Parent
-- 用于在比赛结束时防止 finish() 和计时器重复
local raceActive = true
-- 当玩家触碰终点线并向他们展示奖励时运行
local function finish()
raceActive = false
print("你完成的时间是 " .. timePassed)
if timePassed <= 10 then
print("你获得了金牌!")
elseif timePassed > 10 and timePassed <= 20 then
print("你获得了银牌!")
elseif timePassed > 20 and timePassed <= 30 then
print("你获得了铜牌!")
else
print("再试一次!")
end
end
-- 检查比赛进行时玩家是否触碰了部件
local function partTouched(otherPart)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid and raceActive == true then
finish()
end
end
finishLine.Touched:Connect(partTouched)
-- 在比赛进行时跟踪比赛时间。需要放在脚本底部。
while raceActive == true do
task.wait(1)
timePassed += 1
print(timePassed)
end