Die Planung von Code ist in vielen Situationen nützlich, z. B. um sicherzustellen, dass Code nach dem Abschluss einer bestimmten Aktion oder eines Zyklus ausgeführt wird, oder um Code für eine bestimmte Dauer zu verzögern. Sie können die task-Bibliothek verwenden, um den Aufgabenplaner von Roblox zu optimieren, um Code zu verwalten und zu planen. Sie können auch eine ähnliche Bibliothek namens coroutine verwenden, um Code zu planen, die einige zusätzliche Funktionen bietet.
Häufige Methoden
Die folgenden sind die gebräuchlichsten task-Methoden, die verwendet werden, um Code zu planen. Sie sollten die Aufgabenmethoden anstelle der veralteten Planungsmethoden, wie z. B. wait(), verwenden, um sicherzustellen, dass Ihr Code optimal ausgeführt wird.
Die folgende Tabelle listet die relevanten veralteten globalen Methoden und ihre bevorzugten, optimierteren Gegenstücke auf:
| Veraltete globale Methoden | Aufgabenmethoden | Zusätzliche Alternativen |
|---|---|---|
| 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() nimmt einen Thread oder eine Funktion und startet ihn sofort über den Scheduler der Engine. Zusätzliche Argumente werden an den laufenden Thread oder die Funktion übergeben.
Das folgende Codebeispiel zeigt, wie Sie task.spawn() verwenden können, wenn Sie eine Funktion aufrufen, die möglicherweise während der Iteration über eine Menge von Objekten aussetzen kann:
local function playerAdded(player)
print(player)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
task.defer()
task.defer() nimmt einen Thread oder eine Funktion und verzögert ihn bis zum Ende des aktuellen Erholungspunktes innerhalb des aktuellen Frames. Zusätzliche Argumente werden an den laufenden Thread oder die Funktion übergeben.
Sie sollten dies normalerweise verwenden, wenn Sie ein ähnliches Verhalten wie task.spawn() wollen, es Ihnen aber nicht wichtig ist, dass der Thread sofort läuft. Das folgende Codebeispiel zeigt, wie die print()-Anweisung für "A" verzögert wird, bis die print()-Anweisung für "B" ausgeführt wird:
task.defer(print, "A")print("B")--> B--> A
task.delay()
task.delay() nimmt einen Thread oder eine Funktion und plant ihn zur Fortsetzung nach dem Ablauf der angegebenen Zeit im nächsten Heartbeat-Schritt. Der Thread wird mit integriertem Fehlerhandling und Unterstützung für andere Funktionen der Engine fortgesetzt. Zusätzliche Argumente werden an den laufenden Thread oder die Funktion übergeben.
Da die tatsächliche Verzögerungszeit variieren kann, zeigt das folgende Codebeispiel, wie Sie diese berechnen können, indem Sie die aktuelle Zeit als Argument übergeben:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
Eine Dauer von null führt dazu, dass der Thread oder die Funktion beim nächsten Schritt fortgesetzt wird.
task.wait()
task.wait() pausiert den aktuellen Thread, bis die angegebene Dauer (in Sekunden) abgelaufen ist, und setzt dann den Thread im nächsten Heartbeat-Schritt fort.
Die tatsächliche Wartezeit kann variieren. Das folgende Codebeispiel zeigt, wie diese Methode es zur Bequemlichkeit zurückgibt:
Da die tatsächliche Verzögerungszeit variieren kann, zeigt das folgende Codebeispiel, wie Sie die tatsächliche Zeit erhalten können, indem Sie den Rückgabewert der Methode speichern:
local elapsedTime = task.wait(2) -- Warte 2 Sekundenprint(elapsedTime) --> 2.0792941
Wenn keine Dauer angegeben wird, beträgt die Dauer standardmäßig null, was bedeutet, dass der Thread automatisch beim nächsten Schritt fortgesetzt wird. Das bedeutet, dass task.wait() im Verhalten dem von RunService.Heartbeat entspricht.