Timer와 Delay
시간 기반 로직을 제어하는 Delay, Timer, Timeline 노드를 마스터합니다
Delay 노드
실행 흐름을 일정 시간 대기시키는 Latent 노드
Delay는 지정된 시간(초)이 지난 후 다음 노드를 실행하는 Latent(지연) 노드입니다. 단축키 D + 좌클릭으로 빠르게 생성합니다. 이벤트 그래프에서만 사용 가능하며, 함수 내에서는 사용할 수 없습니다.
// Delay 노드 구조
[Delay]
├─ Exec In
├─ Duration (Float, 초 단위)
└─ Completed (Duration 경과 후 실행)
// 예시: 3초 후 폭발
[Spawn Grenade] ──> [Delay (3.0)] ──> [Explode]
├─ Apply Radial Damage
├─ Spawn VFX
└─ Play Sound
Retriggerable Delay
일반 Delay는 실행 중에 다시 호출되면 무시됩니다. Retriggerable Delay는 다시 호출되면 타이머를 리셋합니다.
// 자동 저장: 마지막 입력 후 5초 뒤에 저장
[Any Input] ──> [Retriggerable Delay (5.0)] ──> [Auto Save]
// 입력할 때마다 5초 타이머가 리셋됨
// 5초간 입력이 없을 때만 Auto Save 실행
Delay: 첫 호출만 유효, 추가 호출 무시. 쿨다운, 1회성 지연에 적합.
Retriggerable Delay: 매 호출마다 타이머 리셋. 입력 디바운스, 자동 저장에 적합.
Set Timer by Event / Function Name
반복 실행과 세밀한 타이머 제어
Set Timer by Event
지정된 시간 간격으로 Custom Event를 반복 호출합니다. Looping을 체크하면 지속적으로 반복됩니다.
// 매 2초마다 체력 회복
[Event BeginPlay] ──> [Set Timer by Event]
├─ Event: [Custom Event: Regenerate]
├─ Time: 2.0
├─ Looping: True
└─ Return Value: Timer Handle ──> (변수에 저장)
[Custom Event: Regenerate]
└──> [Set Health] (Health + RegenAmount)
Set Timer by Function Name
문자열로 함수 이름을 지정하여 타이머를 설정합니다. Set Timer by Event가 더 안전하므로(컴파일 시 오류 검출 가능) 권장됩니다.
[Event BeginPlay] ──> [Set Timer by Function Name]
├─ Function Name: "SpawnEnemy"
├─ Time: 5.0
├─ Looping: True
└─ Return Value: Timer Handle
Timer Handle (타이머 핸들)
Timer Handle은 타이머를 제어하기 위한 참조입니다. 이 핸들을 변수에 저장하면 나중에 타이머를 일시정지, 재개, 제거할 수 있습니다.
| 노드 | 설명 |
|---|---|
| Clear and Invalidate Timer by Handle | 타이머를 정지하고 핸들을 무효화합니다 |
| Pause Timer by Handle | 타이머를 일시정지합니다 |
| Unpause Timer by Handle | 일시정지된 타이머를 재개합니다 |
| Is Timer Active by Handle | 타이머가 실행 중인지 확인합니다 |
| Get Timer Elapsed/Remaining Time | 경과/남은 시간을 반환합니다 |
// 전투 종료 시 회복 타이머 시작, 전투 시작 시 중지
// 변수: RegenTimerHandle (Timer Handle)
[OnCombatEnd] ──> [Set Timer by Event]
├─ Event: Regenerate
├─ Time: 2.0, Looping: True
└─ Handle ──> [Set RegenTimerHandle]
[OnCombatStart] ──> [Clear and Invalidate Timer by Handle]
└─ Handle: RegenTimerHandle
매 프레임 실행이 필요하지 않다면 Timer를 사용하세요. 예를 들어 2초마다 체력 확인은 Timer(2.0, Looping)가 Event Tick보다 60배 이상 효율적입니다. Timer는 실행 빈도를 직접 제어할 수 있어 성능 관리에 유리합니다.
Timeline
커브 기반의 시간에 따른 값 변화 애니메이션
Timeline은 시간에 따른 값 변화를 커브(Curve)로 정의하는 노드입니다. 문 열기/닫기, 조명 변화, 카메라 이동 등 부드러운 보간이 필요할 때 사용합니다.
[Timeline: DoorTimeline]
// 입력 실행 핀:
├─ Play // 정방향 재생
├─ Play from Start // 처음부터 정방향 재생
├─ Stop // 정지
├─ Reverse // 역방향 재생
├─ Reverse from End// 끝에서부터 역방향 재생
│
// 출력 실행 핀:
├─ Update // 매 프레임 (커브 값 출력)
├─ Finished // 재생 완료 시
│
// 출력 데이터 핀:
├─ DoorRotation // Float Track (커브 값)
└─ Direction // 현재 재생 방향
Timeline 에디터
Timeline 노드를 더블클릭하면 전용 에디터가 열립니다.
| 설정 | 설명 |
|---|---|
| Length | 타임라인 전체 길이 (초) |
| Auto Play | BeginPlay 시 자동 재생 |
| Loop | 반복 재생 |
| Use Last Keyframe | 마지막 키프레임을 최종 값으로 사용 |
문 열기/닫기 예제
// Float Track "DoorAngle": 0.0 (닫힘) -> 90.0 (열림), Length: 1.0초
// Curve: 이징(easing) 적용으로 자연스러운 움직임
[Interact Input] ──> [FlipFlop]
├─ A ──> Timeline.Play
└─ B ──> Timeline.Reverse
[Timeline Update] ──> [Set Relative Rotation]
└─ DoorAngle ──> [Make Rotator] └─ Target: DoorMesh
└─ Yaw: DoorAngle
[Timeline Finished] ──> [Play Sound] (DoorLatch)
Float Track: 단일 float 값 (회전 각도, 투명도 등)
Vector Track: XYZ Vector 값 (위치, 크기)
Color Track: Linear Color 값 (조명 색상, 머티리얼 색상)
Event Track: 특정 시점에 이벤트 발생 (키프레임별 효과음)
실전 타이밍 패턴
게임에서 자주 사용되는 시간 기반 로직 패턴
패턴 1: 스킬 쿨다운
// 변수: bCanUseSkill (Boolean, Default: True)
// 변수: CooldownTime (Float, Default: 5.0)
[InputAction UseSkill] ──> [Branch: bCanUseSkill]
│
├─ True ──> [Execute Skill]
│ │
│ ├──> [Set bCanUseSkill = False]
│ └──> [Delay: CooldownTime]
│ └──> [Set bCanUseSkill = True]
│
└─ False ──> [Play "Not Ready" Sound]
패턴 2: 물결 스폰 시스템
// Wave 시작 시 타이머로 적 스폰
// 변수: SpawnTimerHandle, WaveEnemyCount, SpawnedCount
[StartWave]
├──> [Set SpawnedCount = 0]
└──> [Set Timer by Event]
├─ Event: SpawnOneEnemy
├─ Time: 1.5
├─ Looping: True
└─ Handle ──> SpawnTimerHandle
[SpawnOneEnemy]
├──> [Spawn Actor] (EnemyClass)
├──> [Increment SpawnedCount]
└──> [Branch: SpawnedCount >= WaveEnemyCount]
└─ True ──> [Clear Timer: SpawnTimerHandle]
패턴 3: Lerp + Timeline 조합
// 카메라 부드러운 전환
// Timeline Float Track "Alpha": 0.0 -> 1.0 (Length: 2.0초)
[Timeline Update]
└─ Alpha ──> [Lerp (Vector)] ──> [Set Actor Location]
├─ A: StartPosition └─ Target: Camera
├─ B: EndPosition
└─ Alpha: (Timeline Alpha)
// Lerp = Linear Interpolation (선형 보간)
// Alpha 0.0이면 A 위치, 1.0이면 B 위치, 0.5이면 중간
Delay: 단순한 대기 (폭발, 메시지 표시 후 제거)
Retriggerable Delay: 디바운스 (자동 저장, 입력 안정화)
Timer: 반복 실행 (DOT, 스폰, 체력 재생)
Timeline: 값 보간 (문 열기, 카메라 전환, 색상 변화)
핵심 요약
- Delay(D+클릭)는 이벤트 그래프 전용 Latent 노드이며, 함수 안에서는 사용할 수 없다
- Retriggerable Delay는 호출될 때마다 타이머를 리셋하여 디바운스 패턴에 적합하다
- Set Timer by Event는 반복 실행에 적합하며, Timer Handle로 일시정지/재개/제거를 제어한다
- Timeline은 커브 기반으로 시간에 따른 값 변화를 정의하며, Float/Vector/Color/Event 트랙을 지원한다
- 매 프레임 실행이 불필요한 로직은 Timer로 대체하여 성능을 최적화한다
- Timeline + Lerp 조합으로 부드러운 보간(위치, 회전, 색상)을 구현할 수 있다
도전 과제
배운 내용을 직접 실습해보세요
스킬 쿨다운 시스템을 만드세요. Set Timer by Function Name으로 5초 쿨다운을 설정하고, 쿨다운 중에는 스킬 사용을 막는 Boolean 플래그를 관리하세요. 남은 쿨다운 시간을 Get Timer Remaining Time으로 조회하여 화면에 표시하세요.
Timeline 노드에 Float 커브를 추가하여 0에서 1로 2초간 변하는 곡선을 만드세요. Lerp(Vector)와 연결하여 문 Actor의 위치를 닫힌 상태에서 열린 상태로 부드럽게 이동시키세요. Reverse를 사용해 다시 닫히는 기능도 추가하세요.
반복 타이머(Looping Timer)로 자동 체력 회복 시스템을 구현하세요. 2초마다 HP를 5씩 회복하되, 전투 중에는 Pause Timer로 멈추고 전투 종료 후 UnPause Timer로 재개합니다. Timeline을 활용하여 화면 가장자리에 힐 이펙트 페이드 애니메이션도 추가하세요.