多重条件

*此内容使用人工智能(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。按 Enter 自动完成并添加 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 是我们在美国及其他国家或地区的注册与未注册商标。