Agendar código é útil em muitas situações, como garantir que o código seja executado após uma ação específica ou ciclo ter sido concluído, ou atrasar o código por uma duração específica de tempo. Você pode usar a biblioteca task para otimizar o agendador de tarefas do Roblox para gerenciar e agendar código. Você também pode usar uma biblioteca semelhante chamada coroutine para agendar código que possui algumas funcionalidades adicionais.
Métodos comuns
Os seguintes são os métodos task mais comuns usados para agendar código. Você deve usar os métodos de tarefa em vez dos métodos de agendamento legado, como wait(), para garantir que seu código execute de forma otimizada.
A tabela a seguir lista os métodos globais legados relevantes e suas contrapartes preferidas e mais otimizadas:
| Métodos globais legados | Métodos de tarefa | Alternativas adicionais |
|---|---|---|
| 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() recebe uma thread ou função e a retoma imediatamente através do agendador do engine. Argumentos adicionais são passados para a thread ou função sendo retomada.
O seguinte exemplo de código é um exemplo de como você pode usar task.spawn() ao chamar uma função que pode gerar enquanto itera sobre um conjunto de objetos:
local function playerAdded(player)
print(player)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
task.defer()
task.defer() recebe uma thread ou função e a adia até o final do ponto de retomada atual dentro do quadro atual. Argumentos adicionais são passados para a thread ou função em retomar.
Você deve usar isso quando deseja um comportamento semelhante ao task.spawn(), mas não se importa se a thread for executada imediatamente. O seguinte exemplo de código ilustra como a instrução print() para "A" será adiada até depois que a instrução print() para "B" for executada:
task.defer(print, "A")print("B")--> B--> A
task.delay()
task.delay() recebe uma thread ou função e a agenda para ser retomada após a quantidade dada de tempo ter decorrido na próxima etapa de Heartbeat. A thread é retomada com manipulação de erros embutida e suporte a outros recursos do engine. Quaisquer argumentos adicionais são passados para a thread ou função em retomar.
Como o tempo real de atraso pode variar, o seguinte exemplo de código ilustra como você pode calculá-lo passando o tempo atual como argumento:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
Uma duração de zero resultará na thread ou função sendo retomada na próxima etapa.
task.wait()
task.wait() suspende a thread atual até que a duração dada (em segundos) tenha decorrido e, em seguida, retoma a thread na próxima etapa de Heartbeat.
O tempo real de suspensão pode variar. O seguinte exemplo de código ilustra como este método retorna por conveniência:
Como o tempo real de atraso pode variar, o seguinte exemplo de código ilustra como você pode obter o tempo real armazenando o valor de retorno do método:
local elapsedTime = task.wait(2) -- Espera por 2 segundosprint(elapsedTime) --> 2.0792941
Se nenhuma duração for dada, a duração padrão será zero, significando que a thread será automaticamente retomada na próxima etapa. Isso significa que task.wait() é equivalente em comportamento ao RunService.Heartbeat.