排程代碼在許多情況下都是非常有用的,例如確保代碼在特定動作或週期完成後執行,或延遲代碼執行一段特定的時間。你可以使用 task 庫來優化 Roblox 的 任務排程器,以管理和排程代碼。你還可以使用一個名為 coroutine 的類似庫來排程代碼,該庫具有一些額外的功能。
常見方法
以下是最常用的 task 方法,用於排程代碼。你應該使用任務方法,而不是舊版排程方法,例如 wait(),以確保你的代碼運行得更加優化。
以下表格列出了相關的舊版全局方法及其更優化的對應方法:
| 舊版全局方法 | 任務方法 | 其他替代方案 |
|---|---|---|
| wait() | task.wait() | RunService.Heartbeat |
| wait(n) | task.wait(n) | |
| spawn(f) | task.defer(f) | task.delay(0, f) |
| delay(n, f) | task.delay(n, f) | |
| spawn(function() f(uv1, ...) end) | task.defer(f, uv1, ...) | task.delay(0, f, uv1, ...) |
| delay(n, function() f(uv1, ...) end) | task.delay(n, f, uv1, ...) |
task.spawn()
task.spawn() 將一個線程或函數立即通過引擎的調度器恢復。附加的參數將傳遞給被恢復的線程或函數。
以下代碼示例展示了如何在調用可能會在迭代一組對象時等待的函數時使用 task.spawn():
local function playerAdded(player)
print(player)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
task.defer()
task.defer() 將一個線程或函數延遲到當前幀的當前恢復點結束後。附加的參數將傳遞給被恢復的線程或函數。
當你想要類似於 task.spawn() 的行為,但不在乎線程立即運行時,通常應該使用此方法。以下代碼示例說明了 "A" 的 print() 語句將延遲到 "B" 的 print() 語句執行之後:
task.defer(print, "A")print("B")--> B--> A
task.delay()
task.delay() 將一個線程或函數排程在下一次 Heartbeat 步驟中,在給定的時間過去後恢復。該線程將具備內建的錯誤處理和對其他引擎功能的支持。任何附加的參數將傳遞給被恢復的線程或函數。
由於實際延遲時間可能會有所變化,以下代碼示例展示了如何通過傳遞當前時間作為參數來計算它:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
持續時間為零將導致線程或函數在下一個步驟中恢復。
task.wait()
task.wait() 使當前線程等待給定的持續時間(以秒為單位)過去,然後在下一個 Heartbeat 步驟中恢復該線程。
實際的等待時間可能會有所變化。以下代碼示例展示了此方法返回其便捷性:
由於實際延遲時間可能會有所變化,以下代碼示例展示了如何通過存儲該方法的返回值來獲取實際時間:
local elapsedTime = task.wait(2) -- 等待2秒print(elapsedTime) --> 2.0792941
如果未給出持續時間,則持續時間將默認為零,這意味着線程將自動在下一個步驟中恢復。這意味著 task.wait() 的行為等同於 RunService.Heartbeat。