Workspace.SignalBehavior 속성은 이벤트 처리기가 즉시 발사되거나 지연되는지 여부를 제어합니다.엔진의 성능과 정확도를 향상시키는 데 도움이 되는 Enum.SignalBehavior.Deferred을 권장합니다.지연된 이벤트의 이벤트 처리기는 다음 재개 지점에서 중단되었던 이벤트 처리기와 함께 재개되며, 새로 트리거된 이벤트 처리기도 포함됩니다.
다음 다이어그램에서는 Immediate 이벤트 행동과 Deferred 이벤트 행동을 비교합니다.
- Immediate 동작으로, 이벤트가 다른 이벤트를 트리거하면 두 번째 이벤트 처리기가 즉시 발동합니다.
- Deferred 동작으로 두 번째 이벤트가 큐의 뒷부분에 추가되어 나중에 실행됩니다.
소요 시간은 변경되지 않지만 순서가 다릅니다.

“재입장”은 이벤트가 특정 깊이에 도달하면 서로 지속적으로 발사되지 않도록 합니다. 현재 제한은 10입니다.
지연된 이벤트 혜택
Immediate 동작에는 몇 가지 단점이 있습니다.게임에 추가된 모든 인스턴스, 변경되는 속성 또는 다른 트리거가 실행되기 전에 엔진은 Luau 코드를 실행해야 합니다.
- 1,000개의 속성을 변경하려면 각 변경 후 실행될 1,000개의 코드 조각이 잠재적으로 필요합니다.
- 이상한 진단하기 어려운 버그가 발생할 수 있습니다(예: 무언가가 추가되기 전에 제거 이벤트가 발생하는 경우).
- 성능 중요 시스템은 Luau로 왕복해야 하는 이벤트를 발생시킬 수 있습니다.
- 이벤트 처리기는 이벤트가 발생할 때마다 장소를 변경하거나 다른 이벤트를 트리거할 수 있습니다.
- 속성이 두 번 변경되더라도 이벤트가 여러 번 발생할 수 있습니다.An event can fire multiple times despite being redundant, such as a property changing twice.
Luau가 실행될 수 있는 엔진 수명 주기의 특정 부분을 가지면 엔진은 다양한 가정을 사용하여 향상된 성능을 얻을 수 있습니다.
- 성능 중요 시스템은 성능 향상을 위해 Luau에 양보할 필요가 없습니다.
- 엔진 자체가 변경하지 않는 한, 장소는 재시작 지점 외부에서 결코 변경되지 않습니다.
재시작 지점
지연된 후, 이벤트 처리기는 다음 재시작 지점에서 재시작됩니다. 현재 재시작 지점 집합에는 다음이 포함됩니다:
- 입력 처리(처리될 입력마다 한 번씩 재개, 참조 UserInputService)
- 레거시 대기 스크립트 재시작, 예를 들어 wait() , spawn() 및 delay()
영향을 받는 일반적인 코드 패턴
원격 이벤트로 인해 다음 예제는 올바르게 작동을 중지하거나 미묘하게 다른 동작을 보입니다; 즉시 재개되는 이벤트에 의존합니다.
중간 실행 중 이벤트 트리거 및 캡처
이 예제에서는 연기된 이벤트가 활성화되어 있기 때문에 반환되는 false 항상 지연된 이벤트가 활성화되어 있기 때문에 반환됩니다.올바르게 작동하려면 스레드가 이벤트가 발생할 때까지 양보해야 합니다.
local success = false
event:Connect(function ()
success = true
end)
doSomethingToTriggerEvent() -- `이벤트` 발생 원인
return success
이벤트의 첫 번째 발생을 감지하기
connection = event:Connect(function ()
connection:Disconnect()
-- 무언가 하기
end)
지연된 이벤트가 활성화되어 있으면 이벤트에서 연결을 끊기 전에 여러 이벤트 처리기 호출이 대기열에 추가될 수 있습니다.호출 Disconnect() 모든 보류 중인 이벤트 처리기 호출을 취소하며, 즉시 이벤트에 대한 동일한 동작이 존재합니다.
대신, Once()를 사용하여 필요한 첫 번째 호출만 수행하는 이벤트에 연결하는 더 편리한 방법을 사용하십시오.
조상 또는 속성을 변경하는 이벤트
지연된 이벤트는 조상 또는 속성의 변경을 처리하는 이벤트를 발생시키기 위해 조상 또는 속성이 변경된 후에 발생합니다:
local part = Instance.new("Part", workspace)
local function onPartDestroying()
print("In signal:", part:GetFullName(), #part:GetChildren())
end
part.Destroying:Connect(onPartDestroying)
part:Destroy()
스크립트가 호출한 후에 즉시 작동하기 때문에 Destroy() 스크립트가 호출한 후 즉시 인스턴스가 파괴되었기 때문에, onPartDestroying() 호출될 때까지 인스턴스가 이미 파괴되었습니다.자세한 예제는 Instance.Destroying에 참조하십시오.