循环练习 - 创建一个定时桥

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

这个项目是另一个实际使用 for 循环的例子。在这座桥上,玩家将触碰一个按钮,使得桥在有限的时间内可供行走,然后它将消失。为了创建一个计时器并显示剩余时间给玩家,你将使用 for 循环。

设置项目

这座桥可以包含在任何具有基于移动的挑战的 Roblox 项目中,比如一个障碍赛(obby)。

创建部件

  1. 找一个地方建造桥,比如河流或障碍赛中的大间隙。创建三个 锚定 部件,具体如下。

    • TimerDisplay
    • Bridge
    • ButtonBridge
  2. 在未激活时,桥会是半透明的。为此,选择 Bridge 并更改其属性。

    • Transparency = 0.8
    • CanCollide = False

创建计时器显示

当跨越桥时,玩家需要看到距离桥消失还有多少秒。一种显示图像或文本的方法是给一个部件添加一个名为 Surface GUI 的对象。Surface GUIs 也可以用于创建游戏中的标志、自定义健康条和库存系统。本教程将快速介绍这一点,但是更多信息可以在 教程 部分找到。

  1. 选择 TimerDisplay,并添加一个 SurfaceGui。然后,在 Surface Gui 下添加一个 TextLabel

  2. 选择 Surface GUI。在属性中,进行以下更改:

    • 更改 Face,以便在玩家看向计时器的前面时可以看到文本标签。
  3. 选择 TextLabel。在属性中,进行以下更改:

    • Size 设置为 {1, 0},{1, 0}
    • TextScaled 设置为 true。
    • Text 设为空。文本将通过脚本更新。

设置脚本

现在计时器就位,创建一个脚本来控制桥和显示倒计时数字给玩家。

  1. 在 Bridge 部件中,添加一个名为 TimedBridge 的新脚本。在该脚本中,创建以下变量。


    local bridge = script.Parent
    local button = workspace.ButtonBridge
    local timerText = workspace.TimerDisplay.SurfaceGui.TextLabel
    -- 桥将保持坚固的时间
    local timerDuration = 5

编写触碰交互代码

要使用桥,你需要创建两个函数。一个函数将使桥可行走并显示计时器。另一个函数将监听玩家是否触碰了激活桥的按钮。

  1. 创建一个名为 startTimer() 的新函数,并在其中包含一个打印语句。你将使用打印语句来测试你的代码。


    local timerDuration = 5
    local function startTimer()
    print("倒计时开始")
    end
  2. 编写一个名为 buttonPressed() 的函数,以检查是否有生物体触碰按钮。该函数应接受一个参数 partTouched,然后如果在该部件中检测到生物体,则该函数中包含一个空的 if 语句。


    local function startTimer()
    print("倒计时开始")
    end
    local function buttonPressed(partTouched)
    local character = partTouched.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    end
    end
  3. 为了开始计时器,在 if 语句中调用 startTimer() 函数。


    local function buttonPressed(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    startTimer()
    end
    end
  4. buttonPressed() 函数的末尾,将 buttonPressed() 函数连接到按钮的 Touched 事件。


    local function buttonPressed(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    startTimer()
    end
    end
    button.Touched:Connect(buttonPressed)
  5. 运行项目。触碰该部件,查看输出窗口中是否显示打印语句。

故障排除提示

此时,如果桥没有按预期工作,请尝试以下几种方法。

问题:错误消息显示:"... 不是 workspace 的有效成员"

  • 在 TimedBridge 脚本中检查所有部件的拼写是否与资源管理器中所见完全一致。

问题:看不到部件。

  • 确保所有三个部件都是锚定的。
  • 检查桥的透明度属性。

创建计时器

每当玩家踏上桥时,startTimer() 将使桥可行走并开始计时器。一旦计时器到达 0,桥将变得不可行走,造成那些来不及的人坠落。

使桥可行走

首先,脚本需要使桥变得固体或可碰撞,然后开始一个计时器,直到它变得不可行走。

  1. 要使桥可行走,在 startTimer() 中将桥的透明度属性更改为 0(不透明),并将 CanCollide 属性设置为 true。


    local function startTimer()
    -- 使桥可见且可行走
    bridge.Transparency = 0
    bridge.CanCollide = true
    end
  2. 为了创建一个倒计时的计时器,创建一个 for 循环,使用以下值。

    • 控制变量:命名为 count,设置为 timerDuration
    • 结束:0
    • 增量:-1

    local function startTimer()
    -- 使桥可见且可行走
    bridge.Transparency = 0
    bridge.CanCollide = true
    for count = timerDuration, 0, -1 do
    end
    end
  3. 为了向玩家显示计时器,将 timerText 中的文本更改为通过输入 timerText.Text = count 来显示计数。每次 for 循环进行一次迭代,它将向玩家显示计时器中的下一个数字。


    for count = timerDuration, 0, -1 do
    timerText.Text = count
    end
  4. 使用 task.wait 函数使 for 循环每秒只运行一次。


    for count = timerDuration, 0, -1 do
    timerText.Text = count
    task.wait(1)
    end
  5. 运行体验。当你触碰按钮时,桥应出现,计时器开始,然后完成。

防止桥重启

然而,注意到如果你在按钮上四处移动,计时器会不断重启。

这是因为每次接触按钮时都会调用 for 循环并从头开始。为了防止计时器不断重启,你需要添加一个布尔值,一种变量类型,将控制是否允许再次调用 startTimer()

布尔值的书写方式与其他变量相同,但与数字或字符串不同,它们只能设置为 true 或 false。在这种情况下,脚本将使用一个布尔值来检查计时器当前是否正在运行,然后再启动它。

  1. 在脚本的顶部,变量下方创建一个名为 timerActive 的变量,并将其设置为 false,因为尚未按下按钮。


    local timerDuration = 5
    local timerActive = false
    local function startTimer()
  2. 为确保计时器仅在 timerActive 布尔值为 false 时启动,在 buttonPressed() 的 if 语句中添加第二个条件。


    local function buttonPressed(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid and timerActive == false then
    startTimer()
    end
    end
  3. 为了防止 startTimer() 在计时器倒计时结束前再次运行,将布尔值 timerActive 设置为 true。


    local function startTimer()
    timerActive = true
    bridge.Transparency = 0
    bridge.CanCollide = true
  4. startTimer() 函数中, for 循环之后,通过将桥的透明度更改为 0.8 和 CanCollide 设置为 false 来将桥恢复到其原始属性。


    local function startTimer()
    timerActive = true
    bridge.Transparency = 0
    bridge.CanCollide = true
    -- 从 timerDuration 倒计时的 for 循环
    for count = timerDuration, 0, -1 do
    timerText.Text = count
    task.wait(1)
    end
    -- 使桥不可行走
    bridge.Transparency = 0.8
    bridge.CanCollide = false
    end
  5. 最后,为了重置桥,请将 timerText 更改为空字符串,像最初一样。然后,将 timerActive 布尔值设置为 false。


    bridge.Transparency = 0.8
    bridge.CanCollide = false
    timerText.Text = ""
    timerActive = false
  6. 进行游戏测试并检查确保桥可以多次使用。

完整的定时桥脚本


local bridge = script.Parent
-- 通过资源管理器获取按钮
local button = workspace.ButtonBridge
-- 获取显示的部件
local timerPart = workspace.TimerDisplay
-- 获取将显示计时的文本
local timerText = timerPart.SurfaceGui.TextLabel
-- 玩家需要穿过桥的时间
local timerDuration = 5
local timerActive = false
local function startTimer()
print("倒计时开始")
timerActive = true
bridge.Transparency = 0
bridge.CanCollide = true
-- 从 timerDuration 倒计时的 for 循环
for count = timerDuration, 0, -1 do
timerText.Text = count
task.wait(1)
end
-- 使桥不可行走
bridge.Transparency = 0.8
bridge.CanCollide = false
timerText.Text = ""
timerActive = false
end
local function buttonPressed(partTouched)
local character = partTouched.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
print("部件被触碰")
if humanoid and timerActive == false then
print("开始计时")
startTimer()
end
end
button.Touched:Connect(buttonPressed)

总结

循环可以与不同的交互方式结合使用,创造有趣的游戏时刻。在本教程中,使用一个作为倒计时的 for 循环创建了一个定时桥。在倒计时期间,玩家获得了有限的时间来穿过桥。

©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。