블루프린트(Blueprint)는 언리얼 엔진의 시각적 스크립팅 시스템입니다. 글자로 코드를 쓰는 대신 기능이 담긴 상자인 노드를 꺼내 선으로 이어서 동작을 만듭니다. 결과가 바로 눈에 보이기 때문에 입문자가 게임 로직을 익히기에 좋습니다. 이 글은 블루프린트를 처음 열었을 때 알아야 할 구조와 자주 쓰는 노드를 설명합니다.
블루프린트의 종류
| 종류 | 용도 |
|---|---|
| 블루프린트 클래스 | 문, 아이템, 적처럼 여러 번 배치할 수 있는 액터를 만듭니다. 가장 많이 씁니다. |
| 레벨 블루프린트 | 특정 레벨에만 해당하는 이벤트를 만듭니다. 그 레벨의 컷신 시작 같은 일에 씁니다. |
| 위젯 블루프린트 | 체력바, 메뉴, 버튼 같은 UI 화면을 만듭니다. |
| 애니메이션 블루프린트 | 캐릭터의 속도나 상태에 따라 어떤 동작을 재생할지 정합니다. |
| 블루프린트 인터페이스 | 서로 다른 블루프린트가 같은 이름의 기능으로 소통하게 해 주는 약속입니다. |
처음에는 블루프린트 클래스와 위젯 블루프린트만 확실히 익혀도 대부분의 연습 과제를 만들 수 있습니다.
이벤트 그래프와 실행 흐름
블루프린트 편집 창의 이벤트 그래프는 무슨 일이 일어나면 무엇을 할지를 그리는 공간입니다. 빨간색 이벤트 노드가 출발점이 됩니다. 게임이 시작될 때 한 번 실행되는 BeginPlay, 매 프레임 실행되는 Tick, 다른 액터와 겹쳤을 때 실행되는 BeginOverlap이 대표적입니다.
노드 사이를 잇는 선은 두 종류입니다. 흰색 실행 선은 어떤 순서로 실행할지를, 색이 있는 데이터 선은 어떤 값을 넘겨줄지를 나타냅니다. 실행 선이 끊겨 있으면 노드가 있어도 실행되지 않는다는 점을 기억해야 합니다.
Tick은 매 프레임 실행되므로 무거운 작업을 넣으면 성능이 떨어집니다. 일정 시간마다 하면 되는 일은 타이머를 쓰고, 어떤 일이 일어났을 때만 하면 되는 일은 이벤트로 처리하는 습관을 들이는 것이 좋습니다.
변수와 함수
변수는 체력, 점수, 열쇠 보유 여부처럼 값을 담아 두는 칸입니다. 변수마다 숫자, 참거짓, 문자, 다른 액터 참조 같은 자료형이 있고 자료형마다 선 색이 다릅니다. 변수의 눈 모양 아이콘을 켜면 레벨에 배치한 뒤 디테일 패널에서 액터마다 다른 값을 줄 수 있습니다.
같은 노드 묶음을 여러 곳에서 쓴다면 함수로 묶습니다. 데미지 계산, 아이템 획득 처리처럼 이름을 붙일 수 있는 기능 단위로 나누면 그래프가 짧아지고 고치기도 쉬워집니다.
변수 이름은 나중에 다른 사람이 봐도 알 수 있게 짓는 것이 좋습니다. 예를 들어 a, b 대신 현재체력, 최대체력처럼 의미가 드러나는 이름을 쓰면 그래프를 다시 열었을 때 헤매지 않습니다.
블루프린트끼리 소통하기
- 형변환(Cast To): 부딪힌 액터가 플레이어 캐릭터인지 확인하고, 맞다면 그 캐릭터의 변수와 함수를 사용합니다.
- 인터페이스: 문, 상자, 레버처럼 종류는 다르지만 모두 상호작용하기 기능을 가져야 할 때 씁니다. 상대가 누구인지 몰라도 같은 메시지를 보낼 수 있습니다.
- 이벤트 디스패처: 보스가 쓰러졌을 때 문이 열리고 음악이 바뀌는 것처럼 한 사건을 여러 대상에게 알릴 때 씁니다.
입문 단계에서는 형변환을 많이 쓰게 되는데, 여기저기 형변환이 늘어나면 블루프린트끼리 서로 강하게 묶여 수정이 어려워집니다. 상호작용 기능처럼 공통된 동작은 인터페이스로 바꾸는 연습을 해 두면 좋습니다.
처음 만들어 볼 연습 과제
- 밟으면 문이 열리는 발판 만들기
- 먹으면 점수가 오르고 사라지는 코인 만들기
- 점수를 화면에 보여 주는 위젯 만들기
- 체력이 0이 되면 게임오버 화면 띄우기
이 네 가지를 이어 붙이면 아주 작은 게임 한 편이 됩니다. 만들고 나서 그래프에 주석 상자를 달아 구역을 나누면, 나중에 다시 열었을 때도 무엇을 하는 부분인지 바로 알 수 있습니다.
관련 과정
SBS아카데미게임학원 언리얼엔진(Unreal) 과정에서는 블루프린트를 바탕으로 유저 입력, 재질, 애니메이션, 인공지능, UI를 차례로 구현하며 이 글의 기초를 실제 게임 기능으로 확장합니다.
자주 묻는 질문
블루프린트는 C++보다 느린가요?
일반적으로 같은 기능이면 C++이 더 빠르게 실행됩니다. 하지만 대부분의 게임 로직은 블루프린트로도 충분하고, 무거운 계산만 C++로 옮기는 방식이 많이 쓰입니다.
블루프린트 그래프가 너무 복잡해지면 어떻게 하나요?
반복되는 부분은 함수나 매크로로 묶고, 기능별로 주석 상자를 달아 구역을 나눕니다. 그래도 복잡하다면 기능을 다른 블루프린트나 컴포넌트로 분리하는 것이 좋습니다.
