[언리얼 블루프린트 기초] Delay가 함수와 반복문에서 작동하지 않는 이유
언리얼 엔진의 블루프린트를 사용할 때 가장 자주 겪는 혼란 중 하나는 다음과 같습니다:
- "왜 **함수 안에서는 Delay 노드가 작동하지 않지?"
- "왜 **For문이나 While문에서는 Delay로 깜빡이기 같은 걸 구현할 수 없지?"
이번 글에서는 언리얼 블루프린트의 이벤트 흐름과 실행 구조를 이해하고, Delay 노드가 가지는 한계를 구체적으로 설명드립니다.
⏱ Delay 노드의 작동 원리
언리얼의 Delay 노드는 일반적인 프로그래밍 언어의 "sleep"과는 다릅니다.
- Delay는 틱(Tick) 기반 이벤트 흐름에 따라,
- 현재 실행을 일시 중지하고, 지정된 시간 후 다시 이어서 실행합니다.
즉, Delay는 비동기적 흐름 제어를 위해 설계되어 있으며, "이벤트 그래프" 또는 "커스텀 이벤트" 흐름 내에서 작동하도록 제한되어 있습니다.
🚫 함수 내에서 Delay가 작동하지 않는 이유
언리얼에서의 **함수(Function)**는 다음과 같은 특성을 가집니다:
항목 설명
실행 방식 | 동기적, 한 프레임 내 즉시 실행 |
흐름 유지 | 중간에 끊김 없이 한 번에 처리되어야 함 |
목적 | 수학적 계산, Getter 등 빠른 실행 처리용 |
따라서 Delay처럼 "일시 정지 후 다시 이어가는" 흐름은 함수의 구조와 상충됩니다.
만약 함수 내에서 Delay를 시도하면, 블루프린트 컴파일 시 다음과 같은 에러가 발생합니다:
"Delay is not allowed in functions. Consider using a custom event instead."
🔁 반복문(For/While)에서 Delay가 작동하지 않는 이유
반복문도 마찬가지입니다. ForEach, ForLoop, WhileLoop 모두:
- 한 프레임 안에서 반복을 모두 끝내는 구조로 동작합니다.
- 즉, Delay가 중간에 있어도 루프 자체가 실행을 멈추지 않고 다음 반복으로 바로 넘어갑니다.
예를 들어 다음처럼 작성한 블루프린트는 의도대로 작동하지 않습니다:
For Loop (0~5)
├── Delay(0.5)
└── Print String (Index)
→ 결과: 모든 값이 거의 동시에 출력됨
✅ 해결 방법: 커스텀 이벤트 + 재귀 또는 타이머
✔ 재귀 구조 예시
Event BlinkPlatform
├── SetMaterial(Red)
├── Delay(0.2)
├── SetMaterial(Normal)
├── Delay(0.2)
└── Branch (if Count < Max)
└── Call Event BlinkPlatform (재귀 호출)
✔ Timer를 활용하는 방법도 가능
Set Timer by Function Name
├── Function: BlinkOnce
├── Time: 0.2초
├── Looping: true/false에 따라 반복 제어 가능
📌 마무리 정리
상황 Delay 사용 가능 여부 대안
함수(Function) 내 | ❌ 불가능 | 커스텀 이벤트로 분리 |
For/While 루프 내 | ❌ 불가능 | 재귀, Timer 활용 |
커스텀 이벤트 내 | ✅ 가능 | 주요 실행 흐름에 적합 |
Delay는 강력하지만 제한이 있는 노드입니다.
비동기 처리가 필요한 로직은 반드시 이벤트 기반 흐름으로 설계하는 것이 중요합니다.
다음 글에서는 실제 프로젝트에서 Delay와 Timer를 활용한 "시간 제어 로직 패턴"을 예제로 소개해보겠습니다.
'언리얼 엔진 > 언리얼 엔진 개념' 카테고리의 다른 글
Unreal Engine - 네트워크 최적화 핵심 정리 (0) | 2025.03.21 |
---|---|
Unreal Engine - 멀티플레이어 개념 정리 (0) | 2025.03.17 |
Unreal Engine - 모듈 관리: Public과 Private 의존성 이해하기 (0) | 2025.02.13 |
Unreal Engine - 헤더 파일 정리 (0) | 2025.02.10 |
Unreal Engine - Pawn 클래스 설정하기 (1) | 2025.02.06 |