Unreal Engine 5/Unreal Blueprint로 게임 개발 입문

블루프린트를 이용한 비주얼 스크립팅

iiblueblue 2024. 12. 18. 11:34

블루프린트란?

언리얼 엔진에서 제공하는 비주얼 스크립팅 시스템으로 복잡한 코드 작업 없이 드 기반으로 그림을 그려서 프로그래밍을 가능하게 하는 시스템이다.

Unreal의 가장 큰 단점인 사용하기 어렵다는 점을 열심히 보완해주고 있는 기능이라고 할 수 있다. 코드 없이 우리가 블루프린트를 편집할 때 볼 수 있는건 블록 같은 노드들 여러개와 그 노드들에 뚫려 있는 구멍에 이어진 선들이다. 우리는 앞으로 노드와 노드 사이 구멍에 선들을 엮어가며 프로그래밍할 것이다.

 

C++을 사용하면 더 좋은 성능을 낼 수 있음에도 블루프린트를 공부해야하는 것은 비단 C++을 못해서가 아니다. 블루 프린트는 아래와 같은 용도로 사용하고 있기 때문에 꼭 알아두어야 한다.

  • 중요 프로젝트의 프로토타입이나 간단한 로직을 기반으로 하는 게임 제작
  • 타직군과 협력하여 게임을 완성할 수 있음
  • C++ 사용하더라도 블루프린트를 함께 사용하는 경우가 많음

블루프린트 노드는 각 레벨마다 가질 수도 있고 각 물체마다 가질수도 있다. 오늘은 레벨 블루프린트를 편집하여 실습을 진행할 것이다. 언리얼에서 레벨이 하나 생성될 때마다 레벨 블루프린트도 하나를 만들 수 있다고 생각하면 된다.

 


 

레벨 블루프린트 열기

현재 레벨의 블루프린트를 열어보자.

메인 툴바에서 블루프린트 버튼을 누르면 아래 메뉴 중 Open Level Blueprint를 열어준다.

버튼을 눌러 블루프린트를 열면 아래와 같은 창이 새로 열리게 된다. 우리는 이 창에서 블루프린트 노드를 편집한다.

 


 

"Hello World!" 출력하기

조작 방법 및 단축키

조작 설명
마우스 드래그(오) 화면 이동
마우스 드래그(왼) 다중 노드 선택, 노드 이동
마우스 클릭(오) 노드 추가를 위한 검색창(=Tap)
마우스 클릭(왼) 노드 선택
Tap 노드 추가를 위한 검색창(=마우스 우클릭)
마우스 휠 확대, 축소
C 주석(노드를 잡고 C를 누르면 자동 감싸기)
Home 노드가 있는 곳 전체화면으로 이동
Q 노드 정리
노드 더블클릭  

 

이벤트

들어가자마자 빈 판에 널브러져있는 이벤트 두 개가 보였다. 각각 Event Begin Play, Event Tick이다.

우선 이벤트란 무엇일까? 이벤트란 일종의 트리거로 어떤 상황에서 호출될 것이다 라는 약속을 의미한다.

다음으로 이 두 이벤트가 그러면 "어떤 상황"에서 호출되는 것인지 알아보도록 하자.

  • BeginPlay : 게임이 시작될 때 한 번만 실행되는 이벤트
  • Tick 매 프레임마다 계속 실행되는 이벤트

설명만 보면 Unity의 Start와 Update가 생각난다. 둘다 비슷한 상황에 실행되는 것 같아 보인다.

 

로그 출력하기

모든 코딩의 시작인 "Hello World!"를 띄우는 것부터 시작해보자.

우선 무언가 출력시키는 노드가 필요할 것이다.

빈 창에 우클릭하거나 Tab을 눌러 Print Text를 검색하면 같은 이름의 노드가 하나 나오게 된다. 해당 노드를 눌러주면 Print Text라는 이름이 위에 붙은 노드 하나가 생성되게 된다.

펼쳐보기 전까지는 int Text 라고 적힌 빈칸 하나만 있는데 이곳에 출력하고 싶은 내용을 적으면 된다. 우리는 "Hello World!"를 적어주겠다. 펼쳐보면 Duration의 값을 변경할 수 있는데 이는 메시지가 화면에 나타나 유지되는 시간이다.

 

마지막으로 프로젝트를 시작하자마자 한 번 띄워줄 것이기 때문에 Event 중 BeginPlay에 연결해준다.

 

노드 연결이 모두 끝나면 블루프린트 편집 창 왼쪽 위에 컴파일 버튼과 저장 버튼을 눌러준 후 결과는 블루프린트 편집창을 내리고 뷰포트에서 확인하도록 하겠다.

실행 결과는 아래와 같이 뷰포트 왼쪽 위에 Hello World!가 떴다가 사라지는 것을 볼 수 있다.

 

이렇게 블루프린트의 첫 걸음을 뗐다.


 

블루프린트 변수

변수란 어떤 값을 저장하거나 상호작용을 추적하거나 로직의 조건을 결정하는데 사용하는 값을 말한다.

변수를 만들 때는 이름타입 두 가지를 정해주어야 한다. 이름을 짓는 규칙은 여러가지가 있지만 언리얼에서는 보통 변수 이름을 대문자로 시작하고 bool 타입의 경우만 예외적으로 맨 앞에 소문자 b를 적어준다. 타입에는 여러가지가 있는 아래서 정리하긴 했지만 언리얼 내에서도 컨트롤 알트 누르면 자세한 설명이 나온다.

데이터 타입 설명
Boolean 참/거짓 두 가지 상태만 가짐
Byte 정수, 가장 크기가 작음(0~255)
Integer 정수, 일반적인 정수(-21억~21억)
Integer64 정수, 가장 크기가 큼
Float 실수, 정밀도가 우월함(double-precision)
Name 문자열, 엔진 내부에서 사용, 불변인 경우(Name과 Name을 비교하는 것이 String 둘을 비교하는 것보다 빠름)
String 문자열, 일반적인 문자열(ex. 플레이어명)
Text 문자열, 퀘스트 설명같이 다국어 변환이 필요할 경우(번역 가능)

 

변수를 가져오고 수정하기

간단하게 아까 사용한 Print Text에 조금만 더 뭔가를 붙여서 변수를 가져오고 수정하는 방법에 대해서 알아보자.

HP라는 변수를 만들고 그 변수를 초기화한 뒤 가져와서 로그로 출력하는 로직을 만들어볼 것이다.

먼저 HP라는 변수를 만들었다.

변수는 왼쪽 사이드에 VARIABLES 메뉴 옆 +버튼을 누르면 생성할 수 있으며 위에서 설명했듯 일단 만들면 이름과 타입을 결정해야 한다. 왼쪽에서 이름을 수정하고 오른쪽 드롭다운 메뉴에서 원하는 타입을 정할 수 있다.

 

변수를 수정하고 가져오는 노드는 각각 SET, GET이라는 이름을 가졌다. VARIABLES에서 변수를 직접 빈 곳에 끌어다 놓으면 SET이나 GET노드를 놓을 수 있다. 또는 Ctrl을 누르며 드래그하면 GET, Alt를 누르며 드래그하면 SET 노드가 배치된다.

그리고 변수는 SET으로 지정하지 않아도 기본값을 가지고 있을 수 있다. 이는 변수를 눌렀을 때 오른쪽 옆 Default Value에서 설정이 가능하다. 만약 적용되지 않는다면 컴파일을 눌러주면 잘 적용된다.

 

Print Text가 일어나기 전에 HP를 원하는 값으로 수정(SET)해야 한다. 따라서 Print Text가 오기 전 먼저 Set을 Event BeginPlay에 연결해야 한다.

MaxHP의 기본값을 이미 100으로 해놓았기 때문에 GET으로 가져오는 MaxHP는 100이다. HP의 SET과 MaxHP의 GET을 이용해 HP 변수를 100으로 수정해준 뒤, SET 노드 오른쪽 아래 구멍을 Print Text 노드와 연결하여 출력해준다. SET의 노드에서 HP값을 받아오지 않아도 HP의 GET을 이용하여 연결해주는 방법이 있다. 이 둘은 같은 로직이다.

 

HP값을 Print Text에 연결하면 자동으로 가운데 노드가 하나 더 생기는 것을 확인할 수 있다. To Text(Integer) 노드는 Integer형 변수를 Text 형으로 캐스팅(형번환)해주는 노드이다. 이 노드가 갑자기 이 사이에 나타난 이유는 HP는 Integer 형이고 Print Text에 들어가는 변수는 Text 형이여야 하기 때문이다. 

 

이렇게 GET과 SET을 이용하여 변수의 값을 지정하고 출력해볼 수 있다.

 


 

블루프린트 사칙 연산

노드에도 사칙연산이 당연히 존재한다. 노드를 검색할 때 +, -, *, / 만 입력해도 operator에 뜨는 것을 볼 수 있다.

왼쪽에 연결한 것들을 계산해서 오른쪽 구멍으로 return하며 연산에 숫자를 추가하고 싶다면 Add pin 을 눌러 왼쪽의 구멍을 더 추가할 수도 있다.

데미지라는 변수 제작, 기본값 10

hp에서 데미지를 받으면 hp가 닳도록 함.

 

set 오른쪽 아래 구멍이 뭔지 찾아봐야겠음.

 

사칙연산 시 주의사항

  • 0으로 나누기가 가능하다. (ex. 100/0=0으로 출력이 된다.)
  • 나누기의 결과값에 소수점을 포함한 값을 얻고 싶다면 정수/정수가 아닌 하나라고 실수로 하여 나누도록 한다.

 

블루프린트 비교 연산

두 값을 비교하여 참 거짓을 반환하는데 사용한다.

연산자 설명
==  
!=  
<  
>  
<=  
>=  

 

 

블루프린트 논리 연산

연산자 설명
AND  
OR  
NOT  
XOR  

 

 

블루프린트 흐름 제어

Branch

if else 문이 프로그래밍 언어에는 있음. 그것과 비슷

조건이 참이면 이거하고 거짓이면 이거해라

변수 두개 만듦 Var1, Var2 기본값을 각각 10, 5라고 지정

변수1이 더 크기 때문에 비교 연산자랑 연결했을 때 true가 된다.

True 라면 Print text에 Var1이 크다고 출력

 

Sequence

Flip Flop

생략

 

알트 누르면서 노드 시작부분 누르면 연결선 삭제 가능

Format Text로 구색 맞추기

중괄호 넣고 원하는 변수 명을 쓸 수 있음. 

 

-- 증감 연산자

 

for loop

0, 5를 인덱스에 적으면

0, 1, 2, 3, 4, 5 다 나옴 원래는 보통 4까지 나오는데