2026. 2. 26. 17:42ㆍUnreal
오늘은 블루프린트를 이용해서 간단한 FPS의 장전, 발사, 총 스위칭을 구현해보는 시간을 가졌다.
그 전에 먼저 블루프린트란?
블루프린트(BluePrint)는 언리얼 엔진에서 제공하는 비주얼 스크립팅 시스템이다.
복잡한 코드 작성없이, 노드 기반의 블럭을 연결해서 프로그래밍이 가능하게 하는 시스템이다.
현업에서는 프로토타입 구현 혹은 아트 및 기획자 팀원들이 컨텐츠 구현시에 사용한다.
Unreal C++를 사용한다 해도 타 직군과의 협업에서는 블루프린트를 만날 수 밖에 없다.
언리얼 엔진에 들어가서 블루프린트 창을 열어보자.
먼저 레벨 블루프린트다.

언리얼 에디터에 좌측 상단 모양을 클릭해 Open Level Blueprint를 클릭하면 아래와 같은 창이 열리게 된다.

여기서 상단에 Event BeginPlay와 Event Tick이라는 노드를 확인할 수 있다.
이는 이벤트 함수라고 하는데, 이 이벤트 함수란 어떤 사건(Event)이 발생하면 호출되는 함수이다.
BeginPlay : 게임 플레이의 시작이라는 사건이 발생하는 호출되는 함수
Tick : 매 프레임마다 호출되는 함수
이렇게 정의할 수 있다.
BeginPlay를 한 번 실습해보자.

우클릭을 해서 Print String을 검색해 PrintString 노드를 생성한다.
Print String이라는 함수를 이용해 BeginPlay를 호출해보자.

이렇게 노드를 연결하고 F7로 컴파일, Ctrl + S로 저장, Alt + P로 실행해보면,

정상적으로 BeginPlay가 게임 시작과 동시에 출력되는 것을 확인할 수 있다.
다음은 변수에 대해서 학습해보자.
변수란, 상수(값, Constant)를 저장할 수 있는 그릇을 의미한다. 언리얼에서는 멤버변수를 속성(Property)이라고 많이 부른다.

My BluePrint에서 Variables에서 + 버튼을 누르면 아래에 변수가 하나 생성된다.
bIsGameStarted를 생성하고 Boolean 타입으로 생성한다.
타입 변경은 Boolean글자 우측에 ▽모양을 클릭하면 할 수 있다.
+ 보통 언리얼에서 대부분 변수 이름을 대문자로 시작한다. boolean타입 같은 경우엔 소문자 b를 앞에 붙인다.
이 변수를 컴파일 하면

디테일 팹에서 Default Value탭에 비어있는 상태에서

Is Game Started라는 부분이 생긴다.
변수 타입으로는
부울(Boolean) : 참/거짓 두 가지 상태만 가짐
바이트(Byte) : 정수, 가장 크기가 작음(0~255)
인티저(Integer) : 정수, 일반적인 정수(-21억 ~ 21억)
인티저64(Integer64) : 정수, 가장 크기가 큼
플로트(float) : 실수, 정밀도가 더 우월함(Double - Precision)
이름(name) : 문자열, 엔진 내부에서 사용, 불변인 경우
스트링(String) : 문자열, 일반적인 문자열 (ex 플레이어 이름)
텍스트(text) : 문자열, 퀘스트 설명같이 다국어 변환이 필요한 경우
가 있다.

블루프린트 변수의 Get, Set 노드
블루프린트 변수를 드래그하면

다음과 같이 Get, Set으로 나뉜 변수 노드를 생성할 수 있다.

위가 Get 노드, 아래가 Set 노드인데,
Get 노드는 변수를 그대로 가져와 그 변수를 이용해서 다른 노드를 이용하기 위해 사용된다.
Set 노드는 변수의 상태나 값을 변경하기 위해 가져와 그 변경된 값으로 다른 노드를 이용하기 위해 사용된다.
블루프린트 연산 노드

TickCount라는 인티저형 변수를 생성해서 Event Tick에 연결해서 Tick마다 1씩 증가하는 로직을 작성해보자.

이때 사용되는 변수가 Add이다. +를 검색하면 찾을 수 있다.

이런식으로 작성하면 틱마다 1씩 올라가는 로직으로 화면에 로그가 찍히게 된다.

정상적으로 출력되는 모습이다.
이 외에도 연산노드에는
Int(정수), Float(실수) 연산 노드
Add(+)
Subtract(-)
Multiply(*)
Divide(/)
등이 있다.
비교 연산 노드
블루프린트에서 비교 연산자는 두 값을 비교하여 참 또는 거짓을 반환하는데 사용한다.
노드 생성 방법은 사칙 연산과 동일하게 레벨 블루프린트 화면에서 우클릭 후 기호를 검색하면 된다.

연산자 설명
| == | 두 값이 같은지 비교 |
| != | 두 값이 다른지 비교 |
| < | 첫 번째 값이 두 번째 값보다 작은지 비교 |
| > | 첫 번째 값이 두 번째 값보다 큰지 비교 |
| <= | 첫 번째 값이 두 번째 값보다 작거나 같은지 비교 |
| >= | 첫 번째 값이 두 번째 값보다 크거나 같은지 비교 |
논리 연산 노드
블루프린트에서 논리 연산은 여러 조건을 조합하거나 반전하여 복잡한 논리적 흐름을 처리할 때 사용.
연산자 설명
| AND | 두 조건이 모두 참일 때만 결과가 True가 됩니다. |
| OR | 두 조건 중 하나라도 참이면 결과가 True가 됩니다. |
| NOT | 조건의 결과를 반대로 만듭니다. |
| XOR | 두 조건 중 하나만 참일 때 True가 됩니다. |

흐름 제어
Branch와 Sequence
Branch : 조건(True/False)으로 실행 경로 분기
Sequence : 한 입력을 여러 출력으로 순서대로 실행

Branch를 사용해 조건문을 만들 수 있다.

Sequence를 이용해서 블루프린트를 효율적으로 정리할 수 있다.
입력 관련 이벤트 함수
먼저 입력 흐름은 다음과 같다.

마우스 입력은
Mouse Events~ *
키보드 입력은
Keyboard Events ~

마우스 입력 실습

키보드 입력 실습
텍스트 슈팅 게임
지금까지 했던 내용들을 통해 간단한 텍스트 슈팅 게임을 만들어보려 한다.
조건은 다음과 같다.
- 총알은 기본적으로 30발.
- 마우스 좌클릭을 할 때마다 총알이 1발씩 소모됨.
- 키보드 R을 누르면 재장전되어 총알 30발로 충전됨.
먼저 마우스 입력과 키보드 입력을 받아 실습했던 내용들을 토대로 가져와본다.
그리고 총알을 구현해야 하기에 총알을 함수로 만든다.
또한 기본 30발이기 때문에 컴파일 후 디폴트 값을 30으로 설정한다.


그리고 클릭을 하면 총알이 사라지는 것을 구현하기 위해 Subtract 노드를 이용해 클릭 시 1씩 내려가도록 노드를 연결하면 다음과 같다.

비슷한 매커니즘으로 R을 누를 시 재장전 되도록 구현하면 다음과 같다.

Bang!만 나오게 하는건 조금 가시성이 떨어진다고 판단되어 총알의 개수를 나오게 하고 싶다.
그래서 Print String을 또 생성해서 연결해서 Bullet과 연결하면 나오게 된다.

이렇게 하면 정상적으로 출력된다.
하지만 이렇게만 만들면 정상적으로 작동되는 것 처럼 보이지만 실제 게임 로직으로 넣으면 버그가 일어난다.
첫번째로 30발을 기본으로 만들고, 장전도 30발로 충전해 30발이 최대인 것처럼 만들었지만 30발 넘게 발사되는 그런 버그가 생기게 된다.
두번째로 30발이 가득 찼음에도 계속 30발로 다시 충전하는 버그가 생긴다. 이 버그를 수정하고자 한다.
비교 연산자와 브런치를 이용해서 Bullet이 0보다 크면 발사되도록 하고, 30발보다 작을 경우에만 R키를 눌러 장전할 수 있도록 하려고 한다.


이 부분을 넣으면 문제 없이 잘 작동할 것 같다.

다음과 같이 완성했다.
비교 연산자를 사용해보니 이 비교 연산자를 이용해 다른 기능도 만들어보고 싶어졌다.
비교 연산자를 이용해서 여러번 발사하면 총기 과열 기능을 추가하고자 한다.
CurrentTemperature 속성을 추가해 0~30까지는 Normal, 31~70발까지는 High, 71~100까지는 Over로 설정하려고 한다.
CurrentTemperatur라는 Integer 변수와 Normal, High, Over라는 상태를 저장할 CurrentHeatState라는 String 변수를 생성해서 만들어본다.




이렇게 30, 70발보다 클 때 상태를 Set String으로 바꿔주는 코드를 만들고, 출력하도록 했다.

정상적으로 출력되는 모습이다.
온도가 상승되는 코드 말고 하락하는 코드도 만들어보자.
T 키를 눌러 온도를 낮추려고 한다.

작성한 코드이다. 이 코드를 통해 T키를 눌러 1씩 낮춰 상태를 바꿀 수 있는 코드를 작성했다.
그런데 여기서 공통적으로 상태를 변화하는 로직이 있다. 보통 다른 언어에서는 이 부분을 함수로 묶어 관리해 코드의 재사용성을 추구하는 편이다.
블루프린트에서도 함수를 다룬다.

Functions에서 +버튼을 눌러 함수를 만든다. 저 코드를 넣을 함수를 SetTemperature로 작성한다.
저기에 상태의 게이지를 입력받을 Integer 변수 InIncrement를 추가한다.

그리고 SetTemperature를 더블클릭해 함수창에 들어가 함수 로직을 작성한다.

이렇게 로직을 작성하고 다시 블루프린트로 돌아가 작성했던 로직을 지우고 이 함수를 적용하면

다음과 같이 매우 깔끔하게 정리된 모습이다.
간단한 로직을 만들어 보았는데, 앞으로 더 많은 부분을 배워 많은 기능을 추가하는 로직을 만들어보고자 한다.
'Unreal' 카테고리의 다른 글
| 내일배움캠프 Day 6 플랫폼 게임 만들기 (0) | 2026.03.01 |
|---|---|
| 내일배움캠프 DAY5 블렌더 스페이스와 움직이는 액터 (0) | 2026.02.27 |
| 내일배움캠프 DAY4 플레이어 캐릭터 (1) | 2026.02.27 |
| 내일배움캠프 DAY2 언리얼 엔진과 놀아보기 (0) | 2026.02.26 |
| 내일배움캠프 DAY 1 게임 엔진에 대해 알아보고 언리얼 엔진 설치해보기 (0) | 2026.02.25 |