多重条件

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

控制结构可以有多个条件。关键字 elseelseif 可以创建额外的场景,以确定在多种条件下应该发生什么。语法如下:

显示 elseif 和 else 的语法

if isGreen then
print("前进")
elseif isYellow then
print("慢")
elseif isPedestrians then
print("等待")
else
print("停止")
end

在此项目中,elseelseif 被用来编码一个跑酷课程,运动员根据他们的完成时间获得奖励。

编写多个条件的代码

对于这个项目,你可以为每个奖牌编写一个独特的 if 语句来奖励玩家,但这需要花费很多时间。以以下虚构代码为例:

所有 if 语句

if finishTime < 5 then
-- 获得金牌
end
if finishTime >= 5 and <= 10 then
-- 获得银牌
end
if finishTime > 10 and <= 15 then
-- 获得铜牌
end

一种更可读且高效的编码方式是使用一个 if 语句,并使用关键字 elseif 提供可替代条件,以测试之前的条件是否不为真。

使用 elseif 和 else

if finishTime < 5 then
-- 获得金牌
elseif finishTime >= 5 and <= 10 then
-- 获得银牌
elseif finishTime > 10 and <= 15 then
-- 获得铜牌
end

当 if/then 语句运行时,它会从顶部开始,只运行它找到的第一个为真的条件的代码。

设置比赛赛道

首先放置赛道的起点和终点,然后创建一个脚本来计时玩家并颁发不同的奖牌。

  1. 创建一个名为 FinishLine 的固定部件。为了加快测试速度,将起点和终点放得靠近一些。完成脚本后可以移动终点。

    结束部分
    整个课程
  2. 在 FinishLine 中插入一个名为 RaceManager 的脚本。然后,添加一个变量来存储自比赛开始以来经过的秒数,添加第二个变量来引用 FinishLine。


    local finishLine = script.Parent
    local timePassed = 0
  3. 创建一个名为 finish() 的函数。


    local timePassed = 0
    local finishLine = script.Parent
    local function finish()
    end
  4. 自己动手:

    • 编写一个名为 partTouched() 的函数,在玩家触碰时调用 finish()
    • 将结束线部件连接到 partTouched()
    • 将你的代码与下面的示例进行比较。

    local function finish()
    print("触碰了终点线")
    end
    local function partTouched(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    finish()
    end
    end
    finishLine.Touched:Connect(partTouched)
  5. 进行游戏测试,检查在触碰终点线时是否调用 finish()

防止 finish() 重复调用

目前,每当玩家触碰终点线时,finish() 会被持续调用,只要玩家触碰这个部件。

使用一个布尔值,一个存储真或假的变量,确保 finish() 只被调用一次。

  1. 创建一个名为 raceActive 的新变量并将其设置为 true


    local timePassed = 0
    local finishLine = script.Parent
    local raceActive = true
    -- 每当玩家触碰终点线部件时运行
    local function finish()
  2. 在 if 语句中添加第二个条件,以检查 raceActive 是否为真,然后再调用 finish()


    local function partTouched(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid and raceActive == true then
    finish()
    end
    end
  3. 为了防止再次调用 finish(),将 raceActive 设置为 false


    local function finish()
    print("触碰了终点线")
    raceActive = false
    end
  4. 进行游戏测试,检查你的测试打印语句是否只显示一次。

跟踪时间

和 if 语句一样,while 循环也可以使用条件来决定是否运行。为了计时玩家,使用一个 while true do 循环来创建一个定时器,它将仅在 raceActive 布尔值为真的时候运行。

  1. 在脚本底部,输入 while raceActive == true do。按回车自动完成并添加 end


    finishLine.Touched:Connect(partTouched)
    while raceActive == true do
    end
  2. 为了计时玩家,在循环中每秒将 timePassed 变量加 1。包括一个打印语句来测试你的工作。


    finishLine.Touched:Connect(partTouched)
    while raceActive == true do
    task.wait(1)
    timePassed += 1
    print(timePassed)
    end
  3. 进行游戏测试,检查在 输出 窗口中是否显示每秒的计时。

奖励玩家奖牌

最后,使用一个包含多个条件的 if 语句,根据玩家的表现给予他们不同的奖品奖牌。使用 if 语句和两个 elseif 语句检查玩家的完成时间,并给予他们正确的奖牌。

  1. 为了确认可以授予每个奖牌,使用打印语句。


    local function finish()
    raceActive = false
    print("你完成的时间是 " .. timePassed)
    end
  2. 为了授予金牌,编写一个 if 语句,将 timePassed 与所需完成时间进行比较。这个示例检查玩家的时间是否小于或等于 10 秒。


    local function finish()
    raceActive = false
    print("你完成的时间是 " .. timePassed)
    if timePassed <= 10 then
    print("你获得了金牌!")
    end
    end
  3. 进行游戏测试,确认金牌可以被授予。

添加额外的条件

现在你已经测试过金牌,使用 elseif 关键字为其他奖牌编写条件。

  1. 对于银牌,使用 elseif 和下一个所需的时间范围。在这个示例中,该范围是大于 10 秒但小于或等于 20 秒。


    local function finish()
    raceActive = false
    print("你完成的时间是 " .. timePassed)
    if timePassed <= 10 then
    print("你获得了金牌!")
    elseif timePassed > 10 and timePassed <= 20 then
    print("你获得了银牌!")
    end
    end
  2. 对于铜牌,使用相同的模式。检查你的代码与下面的示例。


    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("你获得了铜牌!")
    end
    end
  3. 对于银牌和铜牌进行游戏测试。

故障排除提示

如果你没有看到银牌和铜牌出现,请尝试以下操作。

  • 每个 elseif 后面都应该有一个 then。
  • partTouched() 中,确保 if 语句的第二个条件使用 ==,像 raceActive == true
  • 检查每个 elseif 是否在作用域内。每个 elseif 条件必须位于 if/then 语句的第一行和最后一个 end 之间。

添加 else 条件

如果玩家没有获得任何奖牌,你应该鼓励他们再试一次。在这种情况下,你可以使用 else 语句,它在没有其他条件成立时运行,以向他们展示消息。

  1. 在最后一个 elseif 之下和 end 之上,开始新的一行并输入 else不要添加 then。在 else 下面,使用打印语句提示他们再试一次。


    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
  2. 进行游戏测试查看 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
©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。