흐름 제어 노드 (분기, 루프) 사용법
Branch와 Select, For Loop·For Each Loop의 실행 방식을 익혀 조건과 반복이 있는 그래프를 구성합니다.
지금까지 변수를 통해 데이터를 저장하고, 함수와 이벤트를 통해 특정 작업을 수행하는 방법을 알아보았습니다.
하지만 게임 로직은 단순히 순서대로 실행되는 것만을 의미하지 않습니다.
특정 조건에 따라 다른 행동을 하거나, 특정 작업을 여러 번 반복해야 하는 경우가 훨씬 많습니다.
이때 필요한 것이 바로 흐름 제어 노드(흐름 제어 노드)입니다.
흐름 제어 노드는 블루프린트의 실행 흐름을 원하는 대로 조작하고 분기하며 반복시키는 역할을 합니다.
마치 도로의 신호등이나 갈림길처럼, 프로그램이 나아갈 길을 결정하고 통제하는 핵심적인 요소입니다.
실행 핀은 조건, 순서, 횟수, 상태로 갈라진다. 노드 이름보다 실행을 통제하는 기준을 먼저 본다.
| Branch | 조건으로 두 경로 선택 Health > 0 같은 Boolean 결과가 True와 False 중 하나의 실행 핀을 고른다. |
|---|---|
| Sequence | 독립 작업 순서 실행 상태 갱신, 효과음, 이펙트처럼 서로 다른 작업을 정해진 순서로 이어 실행한다. |
| Do Once / Do N | 통과 횟수 제한 문 열림 사운드처럼 한 번만 허용하거나, 스킬 사용 횟수처럼 N번까지만 허용한다. |
| Gate | 열림 상태로 통과 제어 Open, Close, Toggle 입력으로 실행 흐름의 통과 가능 여부를 바꾼다. |
| Loop | 범위와 컬렉션 반복 First Index부터 Last Index까지는 For Loop, 인벤토리나 적 목록은 For Each로 순회한다. |
조건에 따른 분기: Branch 노드
Branch (브랜치) 노드는 가장 기본적인 흐름 제어 노드이며, 특정 조건(Condition)이 참(True)인지 거짓(False)인지에 따라 실행 흐름을 두 갈래로 나눕니다.
마치 "만약 ~라면 A를 하고, 그렇지 않다면 B를 하라"는 지시를 내리는 것과 같습니다.
-
구조
- 실행 입력 핀 (Execution Input Pin): 브랜치 노드의 실행을 시작합니다.
- 조건 입력 핀 (Condition Input Pin): 불리언(Boolean) 타입의 값을 받습니다. 이 값이
True이면True출력 핀으로 실행 흐름을 넘기고,False이면False출력 핀으로 넘깁니다. - True 실행 출력 핀: 조건이 참일 때 실행될 다음 노드로 연결합니다.
- False 실행 출력 핀: 조건이 거짓일 때 실행될 다음 노드로 연결합니다.
-
활용 예시 플레이어의 체력이 0보다 큰지 확인하여 살아있는지 여부를 판단하는 로직을 가정해봅시다.
Event AnyDamage(액터가 대미지를 받을 때 발생하는 이벤트) 노드에서 실행 핀을 드래그하여Branch노드를 추가합니다.Get CurrentHealth(플레이어의 현재 체력을 가져오는 변수 또는 함수) 노드를 추가하고, 그 출력 값을Integer > Integer노드(더 큰지 비교하는 노드)의 첫 번째 입력 핀에 연결합니다.Integer > Integer노드의 두 번째 입력 핀에는0을 입력합니다.Integer > Integer노드의 불리언 출력 핀을Branch노드의Condition입력 핀에 연결합니다.Branch노드의True출력 핀에는Print String노드를 연결하여 플레이어 생존! 메시지를 출력합니다.Branch노드의False출력 핀에는Print String노드를 연결하여 게임 오버! 메시지를 출력합니다.이 로직은 플레이어가 대미지를 받을 때마다 체력을 확인하여, 체력이 남아있으면 생존 메시지를, 체력이 0이거나 그보다 작아지면 게임 오버 메시지를 출력하게 됩니다.
여러 옵션 중 선택
때로는 단지 참/거짓으로 나누는 것 이상으로 복잡한 흐름 제어가 필요합니다.
-
Sequence노드- 개념: 하나의 실행 입력 핀을 받아 여러 개의 실행 출력 핀을 순차적으로 실행합니다. 비동기적인 작업이 아닐 경우, 첫 번째 출력 핀이 완료된 후에 다음 출력 핀이 실행됩니다.
- 활용 예시: 오브젝트를 활성화한 후, 효과음을 재생하고, 이펙트를 출력하라와 같이 여러 독립적인 작업을 정해진 순서대로 실행해야 할 때 유용합니다.
-
Do N노드- 개념: 입력된 실행 핀을
N번만 실행하고 그 이후로는 더 이상 실행되지 않습니다.N은 설정 가능한 정수 값입니다. - 활용 예시: 적 몬스터가 최대 3번만 특정 스킬을 사용하게 하라.와 같이 특정 동작의 실행 횟수를 제한할 때 사용됩니다.
Reset핀을 통해 횟수를 초기화할 수도 있습니다.
- 개념: 입력된 실행 핀을
-
Do Once노드- 개념:
Do N노드의 특수한 형태로, 입력된 실행 핀을 단 한 번만 실행합니다.Do N에서N을 1로 설정한 것과 같습니다. - 활용 예시: 문이 처음 열릴 때만 잠금 해제 사운드를 재생하라.와 같이 특정 이벤트가 한 번만 발생해야 할 때 유용합니다.
Reset핀을 통해 초기화하여 다시 한 번 실행되도록 할 수도 있습니다.
- 개념:
-
Gate노드- 개념: 문처럼 작동하여, 특정 조건을 만족할 때만 실행 흐름을 통과시킵니다.
Open,Close,Toggle입력 핀을 통해 문을 열고 닫을 수 있으며,Enter핀으로 들어온 실행 흐름이 문이 열려 있을 때만Exit핀으로 나갑니다. - 활용 예시: 플레이어가 특정 지역에 있을 때만 버튼이 작동하도록 하라.와 같이 특정 상태에서만 동작이 허용될 때 사용됩니다.
- 개념: 문처럼 작동하여, 특정 조건을 만족할 때만 실행 흐름을 통과시킵니다.
반복적인 실행: Loop 노드
For Loop는 숫자 범위를, For Each Loop는 배열 요소를 반복합니다. 반복 중 실행과 반복 후 실행을 다른 핀으로 봐야 흐름이 꼬이지 않습니다.
| 구간 | For Loop | For Each Loop | 실수 방지 |
|---|---|---|---|
| 입력 반복 시작 | First Index와 Last Index를 읽음 | Array 핀의 요소 목록을 읽음 | 범위 확인 Last Index는 포함됩니다. |
| 반복 중 Loop Body | 현재 Index를 작업에 사용 | Array Element와 Index를 함께 사용 | 작업 위치 반복마다 할 일만 둡니다. |
| 다음 회차 내부 증가 | Index를 증가시킨 뒤 범위 재검사 | 다음 배열 요소로 이동 | 대량 반복 무거운 작업은 Timer로 나눕니다. |
| 완료 Completed | 모든 숫자를 처리한 뒤 한 번 실행 | 모든 요소를 처리한 뒤 한 번 실행 | 후처리 결과 집계와 다음 흐름을 여기에 둡니다. |
반복은 특정 작업을 여러 번 수행해야 할 때 사용됩니다.
-
For Loop노드- 개념: 지정된 횟수만큼 반복 작업을 수행합니다.
First Index부터Last Index까지 숫자를 세어가며Loop Body를 반복 실행합니다. -
구조
- 실행 입력 핀: 루프를 시작합니다.
First Index(정수): 루프가 시작될 인덱스 값 (보통 0).Last Index(정수): 루프가 끝날 인덱스 값. 이 값까지 포함하여 반복합니다.Loop Body(실행 출력 핀): 각 반복마다 실행되는 로직입니다.Index(정수 출력 핀): 현재 반복 횟수(인덱스)를 반환합니다.Completed(실행 출력 핀): 모든 반복이 완료된 후 실행되는 핀입니다.
- 활용 예시: 인벤토리에 있는 10개의 아이템을 모두 활성화하라. 또는 배열의 모든 요소에 대해 작업을 수행하라.
- 개념: 지정된 횟수만큼 반복 작업을 수행합니다.
-
For Each Loop노드:- 개념: 배열(Array)과 같은 컬렉션의 모든 요소에 대해 반복 작업을 수행합니다. 각 반복마다 배열의 다음 요소를 가져와서 작업을 수행할 수 있습니다.
-
구조
- 실행 입력 핀: 루프를 시작합니다.
Array(배열 입력 핀): 반복할 배열을 연결합니다.Loop Body(실행 출력 핀): 각 배열 요소에 대해 실행되는 로직입니다.Array Element(출력 핀): 현재 반복에서 처리 중인 배열의 요소 값입니다.Index(정수 출력 핀): 현재 처리 중인 배열 요소의 인덱스입니다.Completed(실행 출력 핀): 모든 반복이 완료된 후 실행되는 핀입니다.
- 활용 예시: 모든 적 몬스터에게 대미지를 입혀라. (적 몬스터 목록이 배열로 있을 경우)
아래 다이어그램은 Branch와 Loop를 실제 블루프린트에서 함께 배치할 때, 조건을 먼저 검사하는 흐름과 반복 중에 조건을 검사하는 흐름을 나누어 보여줍니다.
Branch와 Loop는 따로 배우지만 실제 블루프린트에서는 자주 겹친다. 조건을 먼저 검사해 반복을 시작할지 결정하거나, 반복 중인 각 요소마다 Branch로 처리 여부를 고른다.
- 조건을 먼저 검사하는 흐름
플레이어 상태가 유효할 때만 다음 실행 묶음으로 넘어간다. Event AnyDamage 또는 입력 이벤트가 실행 핀을 시작한다 Branch Health > 0 조건으로 생존 여부를 나눈다 Sequence 상태 갱신, 사운드, 이펙트를 순서대로 실행한다 Exit False라면 게임 오버 흐름으로 빠르게 분리한다
- 반복 중에 조건을 검사하는 흐름
배열의 각 요소를 꺼낸 뒤 처리할 대상인지 매번 판단한다. Array 적 목록이나 인벤토리 배열을 For Each Loop에 연결한다 Loop Body Array Element와 Index가 반복마다 갱신된다 Branch 살아 있는 적인지, 빈 슬롯인지 같은 조건을 검사한다 Completed 모든 요소 처리가 끝난 뒤 결과 정리 노드로 넘어간다
- BooleanBranch 조건은 값 노드에서 만든다
Boolean 비교 노드나 변수 값으로 True/False를 만든 뒤 Condition에 꽂는다.
- IndexFor Loop는 숫자 범위가 먼저다
Index Last Index가 포함되므로 10개라면 0부터 9까지인지 확인한다.
- ElementFor Each는 현재 요소를 사용한다
Element 배열 전체가 아니라 Array Element 핀을 처리 노드에 연결한다.
- Done마무리는 Completed에서 한 번만
Done 반복마다 실행할 일과 전체 완료 후 실행할 일을 분리한다.
흐름 제어 노드는 블루프린트 실행 경로를 조건, 순서, 반복 기준으로 나누는 기능입니다.
Branch, Sequence, Do Once, Gate, Loop를 상황에 맞게 조합하면 복잡한 실행 흐름도 단계적으로 구성할 수 있습니다.
실제 그래프에서는 먼저 어떤 질문을 실행 흐름에 던지고 있는지를 구분하면 노드 선택이 쉬워집니다.
다음 다이어그램은 Branch, Sequence, Do Once, Gate, Loop를 질문의 형태에 맞춰 정리합니다.
Branch는 조건을 나누고, Sequence와 Gate는 실행 경로를 정리하며, Loop는 같은 판단을 여러 대상에 반복 적용합니다.
- exec pin그래프에서 마주치는 질문과 노드
exec pin Branch Health > 0 처럼 Boolean 값을 만든 뒤 True와 False 흐름을 분리합니다. Sequence 오브젝트 활성화, 사운드 재생, 이펙트 출력처럼 독립 작업을 차례로 보냅니다. Do Once 잠금 해제 사운드처럼 반복되면 어색한 로직을 막고 Reset 핀으로 다시 열 수 있습니다. 통과 조건 플레이어가 특정 지역 안에 있을 때만 버튼 입력을 Exit으로 통과시킵니다. 반복 For Loop는 숫자 범위, For Each Loop는 배열 요소를 반복 대상으로 삼습니다.
- Branch참이면 A, 거짓이면 B 여부
Branch Health > 0 처럼 Boolean 값을 만든 뒤 True와 False 흐름을 분리합니다.
- Sequence여러 작업을 정해진 순서로 실행하는 여부
Sequence 오브젝트 활성화, 사운드 재생, 이펙트 출력처럼 독립 작업을 차례로 보냅니다.
- Do OnceDoOnce 통과 조건
Do Once 잠금 해제 사운드처럼 반복되면 어색한 로직을 막고 Reset 핀으로 다시 열 수 있습니다.
- 통과 조건열린 상태에서만 실행할 것 여부
통과 조건 플레이어가 특정 지역 안에 있을 때만 버튼 입력을 Exit으로 통과시킵니다.
- 반복같은 처리를 여러 대상에 적용하는 여부
반복 For Loop는 숫자 범위, For Each Loop는 배열 요소를 반복 대상으로 삼습니다.
- pin order연결할 때 흐름을 안정시키는 순서
pin order 조건 값 먼저 비교 노드와 변수로 Branch의 Condition을 완성합니다. 반복 범위 확인 For Loop의 Last Index가 포함되는지 먼저 계산합니다. 마무리 분리 반복마다 할 일은 Loop Body, 전체 정리는 Completed에 둡니다.
이번 절에서는 블루프린트의 실행 흐름을 제어하는 핵심적인 노드들에 대해 알아보았습니다.
이 노드들을 이해하고 활용하는 것은 블루프린트 개발 역량을 한 단계 높이는 중요한 과정입니다.
노드 이름보다 중요한 것은 실행이 왜 갈리고, 몇 번 반복되며, 누가 다시 열고, 어디에서 끝나는지다. 네 문장 중 하나라도 비면 플레이 전에 경로를 다시 닫는다.
- 질문을 이름 붙인다
Branch의 Condition을 “체력이 남았는가?”처럼 참·거짓 한 문장으로 읽는다.
- 반복 한도를 고정한다
For Loop 범위와 배열 길이를 확인하고, 중단 가능하면 Break 조건을 먼저 둔다.
- 상태의 주인을 정한다
Do Once의 Reset과 Gate의 Open·Close를 어떤 이벤트가 호출하는지 한곳에서 추적한다.
- 끝점을 연결한다
False·Completed·Break 뒤에 다음 행동 또는 의도된 종료가 보이게 만든다.
분기와 반복을 안전하게 읽기 위한 기준을 덧붙입니다.
조건 분기와 반복은 실행 경로를 늘리므로 True/False, Completed, Break 같은 끝점을 함께 설계한다.
| 질문 | 판정 |
|---|---|
| 조건이 참/거짓 두 갈래인가? | Branch. False 경로도 의도적으로 처리한다. |
| 선택지가 셋 이상인가? | Switch. 기본 경로와 누락 상태를 확인한다. |
| 배열을 모두 처리하나? | For Each Loop. Completed 후속 처리를 둔다. |
| 중간에 멈춰야 하나? | Loop with Break. Break 조건을 먼저 문장화한다. |
| 신호 | 해석 |
|---|---|
| 안전 기준 | 반복 안에서 Spawn, Find, Save 같은 무거운 작업을 무심코 넣지 않는다. |
| 디버그 | Index와 조건값을 출력하면 어느 반복에서 멈췄는지 보인다. |
흐름 제어 노드는 실행 경로를 늘리므로 조건, 선택지, 반복 종료 지점을 같이 보며 그래프를 제한해야 합니다.
분기는 경로를 늘리고 반복은 실행 횟수를 늘리므로, 시작보다 종료 조건이 더 중요하다.
- 분기 계열
Branch 불리언 질문 하나를 True/False로 나눈다. Switch 상태가 여러 개인 경우 누락 경로를 줄인다. Gate 열려 있을 때만 실행 흐름을 통과시킨다.
- 반복 계열
For Loop 정해진 인덱스 범위만 반복한다. For Each 배열 요소를 하나씩 처리한다. Completed 반복 후속 처리 위치를 명확히 한다.
| 검수 | 의미 |
|---|---|
| 핵심 | True 경로보다 False, Break, Completed가 있는지 먼저 본다. |
| 품질 신호 | 조건 이름이 질문처럼 읽히면 그래프가 빨리 이해된다. |