코드 예약은 특정 작업이나 주기가 완료된 후에 코드가 실행되도록 하거나, 특정 시간 동안 코드를 지연시키는 등의 다양한 상황에서 유용합니다. 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()은 스레드 또는 함수를 받아 엔진의 스케줄러를 통해 즉시 재개합니다. 추가 인자들은 재개되는 스레드 또는 함수에 전달됩니다.
다음 코드 샘플은 객체 집합을 반복하면서 yield할 수 있는 함수를 호출할 때 task.spawn()을 사용하는 방법을 보여줍니다:
local function playerAdded(player)
print(player)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
endtask.defer()
task.defer()는 스레드 또는 함수를 받아 현재 프레임 내의 현재 재개 지점 끝까지 지연시킵니다. 추가 인자들은 재개되는 스레드 또는 함수에 전달됩니다.
일반적으로 task.spawn()과 유사한 동작을 원하지만 즉시 실행되는 것에 신경 쓰지 않을 때 사용합니다. 다음 코드 샘플은 "B"에 대한 print() 문이 실행된 후 "A"에 대한 print() 문이 지연되는 방법을 보여줍니다:
task.defer(print, "A")
print("B")
--> B
--> Atask.delay()
task.delay()는 스레드 또는 함수를 받아, 다음 Heartbeat 단계에서 지정된 시간이 경과한 후 재개되도록 예약합니다. 스레드는 내장된 오류 처리 및 기타 엔진 기능을 지원하여 재개됩니다. 추가 인자들은 재개되는 스레드 또는 함수에 전달됩니다.
실제 지연 시간은 다를 수 있으므로, 다음 코드 샘플은 현재 시간을 인자로 전달하여 이를 계산하는 방법을 보여줍니다:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())0의 지속 시간은 스레드 또는 함수가 다음 단계에서 재개되는 결과를 가져옵니다.
task.wait()
task.wait()는 주어진 시간(초 단위)이 경과할 때까지 현재 스레드를 yield하며, 그 후 다음 Heartbeat 단계에서 스레드를 재개합니다.
실제 yield 시간은 다를 수 있습니다. 다음 코드 샘플은 편의를 위해 이 방법이 반환하는 시간을 보여줍니다:
실제 지연 시간이 다를 수 있으므로, 다음 코드 샘플은 메서드의 반환 값을 저장하여 실제 시간을 얻는 방법을 보여줍니다:
local elapsedTime = task.wait(2) -- 2초 간 대기
print(elapsedTime) --> 2.0792941지속 시간을 제공하지 않으면 기본 지속 시간은 0으로 설정되어 스레드가 자동으로 다음 단계에서 재개됩니다. 이는 task.wait()가 RunService.Heartbeat와 동등한 동작을 한다는 것을 의미합니다.