在许多情况下,计划代码有用,例如确保代码在特定的行动或周期完成后执行,或延迟代码在特定时间段内。您可以使用 task 图形库来优化 Roblox 的 任务调度器 来管理和安排验证码。您还可以使用类似的图书馆 coroutine 来安排具有一些额外功能的代码。
常用方法
以下是最常用的 task 方法用于安排验证码。您应该使用任务方法超过遗产排程方法,例如 wait() ,以确保您的代码最优化地运行。
下表列出了相关的遗产全球方法和其首选、更优化的替代方法:
| 遗产全球方法 | 任务方法 | 额外选择 | | :-------------------------------------- | :------------------------------------------------- | :------------------------------------------------- | | wait() | task.wait() | RunService.Heartbeat | | wait(n) | Library.task.wait()\|task.wait(n) | | | spawn(f) | Library.task.defer()\|task.defer(f) | Library.task.delay()\|task.delay(0, f) | | delay(n, f) | Library.task.delay()\|task.delay(n, f) | | | spawn(function() f(uv1, ...) end) | Library.task.defer()\|task.defer(f, uv1, ...) | | | Library.task.delay()\|task.delay(0, f, uv1, ...) | | delay(n, function() f(uv1, ...) end) | Library.task.delay()\|task.delay(n, f, uv1, ...) |
任务.spawn
task.spawn() 接受一个线程或函数,并立即通过引擎的调度任务计划程序恢复它 即时 额外的参数传递到正在恢复的线程或函数。
以下代码示例是你在调用可能在循环过程中产生的函数时使用 task.spawn() 的一个例子:
local function playerAdded(player)
...
(yield)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
任务.defer
task.defer() 接受一个线程或函数,并将其拖到下一个 恢复周期 之后,在那里它被引擎的调度程任务计划程序恢复。额外的参数传递到线程或函数恢复。
您通常应该在需要类似行为到 task.spawn() 但不关心立即运行的线程时使用此功能。以下代码示例展示了如何在 声明执行之后才能推迟 声明的执行:
task.defer(print, "A")print("B")--> B--> A
任务.延迟
task.delay() 接受一个线程或函数,并将其安排在下一步的 Heartbeat 步中恢复后的给定时间过期。线程以内置错误处理和支持其他引擎功能继续运行。任何额外的参数都会传递到线程或函数恢复。
因为实际延迟时间可能会有所不同,以下代码示例展示了您如何通过传递当前时间作为参数来计算它:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
零的持续时间将导致在下一步上线程或函数恢复。
任务.等待
task.wait() 在指定时间(秒)过期后生成当前线程,然后在下一步的Heartbeat步中恢复线程。
实际的产出时间可能会有所不同。以下代码示例展示了这种方法如何为了方便返回它:
因为实际延迟时间可能会有所不同,以下代码示例展示了您如何通过存储方法返回值来获得实际时间:
local elapsedTime = task.wait(2) -- 等待 2 秒print(elapsedTime) --> 2.0792941
如果没有提供时间长度,时间长度将默认为零,这意味着线程在下一步自动恢复。这意味着 task.wait() 在行为上与 RunService.Heartbeat 相等。