고급 로직 패턴
단순한 연결을 넘어, 이 장에서는 플로우 시스템의 **런타임 아키텍처(Runtime Architecture)**를 깊이 있게 다룹니다.
시스템이 트리거(Trigger)와 체인(Chain)을 어떻게 실행하는지, 그리고 노드 설정이 이벤트 설정과 어떻게 상호작용하는지 이해하는 것은 복잡한 게임 로직을 마스터하는 핵심 열쇠입니다.
⚙️ 핵심 메커니즘: 트리거 vs. 체인
플로우 그래프에서 연결은 단순한 선이 아니라 **제어권의 전달(Transfer of Control)**을 의미합니다. 타겟 노드의 타입에 따라 그 제어권이 처리되는 방식이 결정됩니다.
| 특징 | 🟠 트리거 노드 (Trigger) | 🟢 체인 노드 (Chain) |
|---|---|---|
| 실행 모드 | 병렬 (팬아웃 / Fan-Out) | 직렬 (시퀀스 / Sequence) |
| 차단(Blocking) 여부 | ❌ 비차단 (Non-Blocking) | ✅ 차단 (Blocking) |
| 기술적 구현 | 실행 후 방치 (Fire-and-Forget) | 코루틴 일시 중단 (Coroutine Yield) |
| 데이터 흐름 | 모든 자식 노드에게 즉시 데이터를 전달합니다. | 처리가 끝난 후에만 다음 자식 노드에게 데이터를 전달합니다. |
1. 트리거 메커니즘 (병렬 실행)
플로우가 트리거 노드에 진입하면:
- 시스템은 연결된 모든 트리거의 **우선순위(Priority)**를 계산합니다.
- 루프를 돌며 하나씩 실행합니다.
- 결정적으로, 다음 트리거를 시작하기 전에 이전 트리거의 작업이 끝날 때까지 기다리지 않습니다.
- 결과: 플레이어에게는 모든 효과(사운드, UI, 파티클)가 동일한 프레임에 동시에 발생하는 것처럼 보입니다.
2. 체인 메커니즘 (순차 실행)
체인 노드는 연출의 템포를 조절하기 위해 설계된 복잡한 라이프사이클을 가집니다. 두 단계의 지연 레이어를 사용하여 플로우를 유지합니다:
- 실행 전:
시작 지연(Start Delay)시간 동안 대기합니다. - 실행: 이벤트를 발생시킵니다.
- 실행 후:
지속 시간(Duration)또는완료 대기(Wait For Completion)시간 동안 대기합니다. - 신호: 이 모든 과정이 끝난 후에야 비로소 다음 노드를 실행합니다.
⏱️ 실행 타임라인 (Timeline of Execution)
노드 설정(그래프)이 이벤트 설정(인스펙터)과 어떻게 상호작용하는지 이해하는 것이 매우 중요합니다.
"이중 지연(Double Delay)" 규칙
노드에 지연 시간을 설정하고 이벤트에도 지연 시간을 설정하면, 이 둘은 합산됩니다.
액션까지의 총 시간 = 노드 시작 지연 + 이벤트 액션 지연
시각적 타임라인
단일 체인 노드가 실행되는 과정을 밀리초 단위로 분해한 모습입니다:
[플로우가 노드에 진입]
│
├── 1. 노드 조건 확인 (그래프 레이어)
│ 🛑 False인 경우: 중지 (STOP).
│
├── 2. 노드 시작 지연 (그래프 레이어) ⏱️
│ ⏳ 대기 중...
│
├── 3. 이벤트 발생 (코어 레이어) 🚀
│ │
│ ├── a. 이벤트 조건 확인 (인스펙터 레이어)
│ │ 🛑 False인 경우: 액션 건너뜀 (하지만 플로우는 계속됨!)
│ │
│ ├── b. 이벤트 액션 지연 (인스펙터 레이어) ⏱️
│ │ ⏳ 대기 중...
│ │
│ └── c. UnityActions 호출 (게임 로직) 🎬
│ (예: 애니메이션 재생, 체력 감소 등)
│
├── 4. 노드 지속 시간 / 대기 (그래프 레이어) ⏳
│ 🛑 플로우가 여기서 차단(BLOCKED)됩니다.
│ (지속 시간만큼 대기하거나 비동기 완료를 기다림)
│
└── 5. 다음 노드 신호 전달 ⏭️
- 이벤트 조건은 오직 *로컬 부수 효과(단계 c)*만 중단시킵니다. 플로우 그래프가 4단계와 5단계로 진행되는 것을 막지 않습니다.
- 플로우 그래프 로직 자체를 중단시키려면 반드시 노드 조건(1단계)을 사용해야 합니다.
🛠️ 요리책: 실전 디자인 패턴
일반적인 게임 개발 문제를 해결하기 위한 표준 아키텍처 패턴들입니다.
1. "시네마틱" 패턴 (컷씬)
목표: 엄격하게 시간이 지정된 이벤트 시퀀스. 시나리오: 카메라 이동 -> 문 열림 -> 캐릭터 입장 -> 대화 시작.

- 구조: 루트 ➔ 체인 ➔ 체인 ➔ 체인.
- 설정:
- 모든 단계에 **체인 노드(🟢)**를 사용합니다.
- **노드 지속 시간(⏳)**을 사용하여 시퀀스의 템포를 조절합니다.
- 예시: "문 열림 애니메이션"이 2.0초 걸린다면, 노드 지속 시간을 2.0으로 설정하여 캐릭터가 닫힌 문을 뚫고 지나가지 않도록 보장합니다.
2. "브로드캐스터" 패턴 (플레이어 사망)
목표: 하나의 상태 변경이 독립적인 여러 시스템을 트리거함. 시나리오: 플레이어 사망 시 사운드 재생, 게임 오버 UI 표시, 래그돌 생성, 게임 저장 기능을 동시에 실행해야 함.

- 구조: 루트 ➔ 다중 트리거.
- 설정:
- 루트: OnPlayerDeath.
- 자식: 4개의 별도 트리거 노드(🟠).
- 이유: "게임 저장" 시스템이 멈추거나 오류가 발생하더라도 "게임 오버 UI"가 나타나는 것을 차단해서는 안 됩니다. 병렬 실행은 이러한 안전성을 보장합니다.
3. "하이브리드 보스" 패턴 (복잡한 상태)
목표: 복잡한 AI 페이즈 전환. 시나리오: 보스가 페이즈 2에 진입. 보스가 포효(애니메이션)하는 동시에 음악이 바뀌고 아레나가 붉게 변함. 포효가 끝나면 보스가 공격을 시작함.

- 구조:
- 루트 (OnHealthThreshold).
- 체인 노드 (BossRoarAnim): 완료 대기(Wait For Completion) 체크 (또는 지속 시간을 애니메이션 길이에 맞춤).
- 트리거 노드 (MusicChange): 루트에 연결 (포효와 병렬 실행).
- 트리거 노드 (ArenaColorChange): 루트에 연결 (포효와 병렬 실행).
- 체인 노드 (StartAttack): BossRoarAnim 노드 뒤에 연결.
- 플로우:
- 음악과 색상 변경은 포효와 함께 즉시 발생합니다.
- StartAttack은 포효 체인 노드가 완전히 끝날 때까지 기다립니다(타임라인 4단계).
🎯 요약: 언제 무엇을 사용하나요?
| 요구 사항 | 노드 타입 사용 | 이유 |
|---|---|---|
| "X를 하고 나서 Y를 실행" | 체인 (🟢) | 차단(Blocking)을 통해 순서를 보장합니다. |
| "X, Y, Z를 한꺼번에 실행" | 트리거 (🟠) | 실행 후 방치 방식. 병렬 실행됩니다. |
| "HP < 0이면 X를 실행" | 노드 조건 | 플로우 로직 전체를 중단시킵니다. |
| "음소거가 아닐 때만 사운드 재생" | 이벤트 조건 | 부수 효과는 중단시키되 플로우 로직은 유지합니다. |
| "X를 하기 전에 잠시 대기" | 노드 시작 지연 | 이벤트 발생 자체를 지연시킵니다. |
| "X를 한 후 Y를 하기 전에 대기" | 노드 지속 시간 | (체인 전용) 다음 노드로 가는 신호를 지연시킵니다. |