コードのスケジュールは、特定のアクションやサイクルが完了した後にコードが実行されることを保証したり、特定の期間コードを遅延させたりするなど、多くの状況で役立ちます。 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)` |
| delay(n, f) | `Library.task.delay() | task.delay(n, f)` |
| spawn(function() f(uv1, ...) end) | `Library.task.defer() | task.defer(f, uv1, ...)` |
| delay(n, function() f(uv1, ...) end) | `Library.task.delay() | task.delay(n, f, uv1, ...)` |
task.spawn()
task.spawn() はスレッドまたは関数を受け取り、エンジンのスケジューラを通じて 即座に 再開します。追加の引数は再開されるスレッドまたは関数に渡されます。
以下のコードサンプルは、オブジェクトのセットを反復処理中に yield する可能性がある関数を呼び出すときに 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 と同様の動作をします。