排程代碼在許多情況下都有用,例如確保代碼在特定動作或週期完成後執行,或延遲代碼一段特定時間。您可以使用 task 圖形庫來優化 Roblox 的 任務調度器 來管理和安排代碼。您也可以使用類似的圖書館稱為 coroutine 來安排一些額外功能的代碼。
常見方法
以下是最常用的 task 方法來安排代碼。您應該使用任務方法超過舊版排程方法,例如 wait() ,以確保您的代碼最佳運行。
下表列出相關的舊版全球方法和其優先、更優化的替代方法:
| 傳統全球方法 | 任務方法 | 額外選擇 | | :-------------------------------------- | :------------------------------------------------- | :------------------------------------------------- | | | | | | | | | | | | | | | | | | | | | | | | |
任務.spawn
task.spawn() 取一個線程或功能並將其重新啟動 立即 通過引擎的排程器。額外的參數傳送到正在被恢復的線程或功能。
以下代碼示例是當呼叫可能在循環過程中產生的函數時,您可以使用 task.spawn() 的例子:
local function playerAdded(player)
...
(yield)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
任務.延遲
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 相等。