블루 프린트? 그게뭐야?

정혜창·2024년 12월 18일
0

내일배움캠프

목록 보기
8/43
post-thumbnail

오늘은 언리얼의 꽃? 이라고나 할까. 오브젝트, 레벨 등 게임안의 거의 모든것이 움직이며 살아 숨쉬는 듯이 만들어 주는 마법같은 존재. 블루프린트 강의가 시작되었다. 코딩을 그림처럼 설계할 수 있다는 점에 '비주얼 스크립팅'이라고도 불리는 블루 프린트는 애초에 코딩을 몰라도 프로그래밍을 한 것 처럼 사용할 수 있게 도와주기 위해 고안된 기능이다. 하지만 말그대로 코딩을 기반으로 만들었기 때문에 코딩을 모르면 사실상 배우는 난이도는 매우 어렵다고 할 수 있다.

나같은 경우는 아직 코딩 공부를 한지 얼마되지 않았기 때문에 사실 강의 전에 많이 겁을 먹었었다. 수업의 난이도는 어렵지 않았다곤 할 수 없었지만 코딩 공부를 했던 그 몇일이 정말 블루프린트를 이해하는데 엄청난 도움을 줬던 것 같다. 오늘은 배움이 크지 않아서 식견이 깊지는 않지만 오늘 공부의 나름의 해석을 해보고 복습을 해보고자 한다.


블루프린트 열기

우선 오늘은 레벨 블루프린트를 생성하여 노드를 배치하고, 설계해보았었다. 레벨은 앞서 배웠던 것처럼 '맵' 같은 개념이기 때문에 레벨 블루프린트는 하나씩 짝을 맞춰 생성된다.



블루프린트 시작

레벨 블루프린트에 들어가보니 우선 우리가 만지지도 않았는데 생성되어 있는 빨간 노드가 2개 있었다.

이 빨간색 노드들은 앞에 Event에 붙어 있듯이 어떠한 사건을 일으키는 노드들이다. 위의 Event BeginPlay 노드는 게임이 시작할 때 '어떤' 사건을 일으키는 노드이다. '어떤' 이라는 방법들이나 수단같은 경우는 이어지는 노드들로 인해 이루어진다. 마찬가지로 Event Tick 같은 경우는 게임을 시작하고 프레임 단위로 계속해서 사건을 일으키는 노드다. 이후 노드들을 상황이나 목적에 맞게 생성을 하다보면 제각각 색깔이 다른 것을 볼 수 있는데 그 노드들의 성질을 구분하기 쉽게위한 것이다.

역시 어떤 프로그램을 배울 때마다 세로운 세계를 만나는 느낌이라 그런가 'Hello world' 를 출력해보았다.

Hello World는 실행을 하고나면 화면 왼쪽 상단에 보여진다. 일단 위 사진을 분석을 해보자. 아까와 달리 Print Text라는 파란색 노드가 생겼고 빨간 노드와 작대기를 통해 이어주고 있다. 그리고 오른쪽 노드안에는 in Text 와 Hello World가 있다. 그림을 글로 풀어 쓰자면

플레이를 시작하면 이벤트를 시켜라 -----> 텍스트 출력을 (Hello world) 가 된다.

보기편하게 말하자면 '플레이가 시작되면 Hello world를 출력시켜라'가 된다. 또한 작대기가 이어진 곳을 보면 하나의 방향을 향하는 것을 볼 수 있는데 이것은 명령의 방향이라고 생각하면 된다.



블루프린트 변수

블루프린트에서 변수는 데이터를 저장하고 관리하는 컨테이너를 의미한다.

WOW 변수들의 종류가 정말 많다. 변수는 서로 종류가 다르면 저장하는 값들의 성질이 다르다.
기본적인 데이터 타입은 이렇다.

부울(Boolean) : 참 /거짓 두가지 상태만 가짐 (1,0)
바이트(Byte) : 정수, 가장 크기가 작음
인티저(Integer) : 정수, 일반적인 정수
인티저64(Integer64) : 정수, 크기가 큼
플로트(Float) : 실수, 정밀도가 우월함
이름(Name) : 문자열, 엔진 내부에서 사용, 불변인 경우
스트링(String) : 문자열, 일반적인 문자열
텍스트 : 문자열 퀘스트 설명같이 다국어 변환이 필요한 경우

  • Get, Set

변수들을 생성하고 프린트 화면에 드래그&드롭이 가능한데 Get변수 또는 Set변수 형태로 노드를 선택할 수 있다. 이 기능은 변수에 값을 설정하고 값을 읽어오는 데 사용된다. 또한 객체의 상태를 조작하거나 확인할 때 매우 기본적이고 중요한 역할을 한다.



과제

문제.1

우선 이 문제를 보고 가장 먼저 생각을 했던건 가감, 증감, 비교연산자, 그리고 branch였다.
일단 1번 총알 발사 버그부터 살펴보자. 처음으로는 '왼쪽 마우스를 클릭했을 때 총알이 감소'하는 이벤트노드를 만들었다. 그리고 나서는 총알이 30발 이상일 경우 총알이 다찼다는 문구를 내고, 그렇지 않으면 하나씩 감소하는 식으로 식을 머리속으로 짜봤다.

실제로 적용한 결과 우선 총알의 기본값을 30으로 주고 만약 총알이 0보다 클경우 한발씩 감소하여 그것을 택스트로 출력하였고 0보다 그 외의 경우(0보다 작거나 같을경우)에는 총알이 비었다는 문구를 출력하게 하였다. 매우 잘 작동하였다.

하지만 이런식으로 말고 약간 다르게 짤 수도 있지 않을까 싶은 생각으로 하나를 더 구상해보았는데 branch 노드를 감소노드 뒤로 넣어서 다른 조건을 주어 똑같은 결과를 내게 해보았다.

똑같은 결과를 내는건 맞지만 위의 식보다 노드가 많다. 단지 branch의 위치만 바꾸었을 뿐인데 신기한일이다. 노드들의 수가 적어지면 그만큼 컴퓨터의 연산속도도 빨라지고 보기도 편해진다. 같은 결과라도 좀더 컴팩트한 블루프린트를 설계할 수 있도록 많은 생각과 실습을 해봐야겠다는 생각이 든다.


다음은 총알 재장전인데 이것도 마찬가지로 branch를 써서 블루프린트를 했다.

원리는 위의 총알개수와 같다. 한번 해봤다고 그리 어렵지 않게 느껴진 문제였다.



문제.2

문제 2번은 1번보다는 좀더 생각을 요하는 문제였었다. 일단 총알을 맞으면 피해를 입고, 피해를 치료하는 것을 각각 따로 짰을 땐 쉽게 짤수 있는데 막상 HP를 공유하자니 뭔가 잘안되어서 막혔었던 것 같다. 하지만 두가지의 조건을 하나의 Branch에 넣고 이중 Branch문을 써서 HP의 무한대와 음수의 길을 막으니 생각보다 매우 잘 작동되어서 흡족했던 것 같다.
중간에 피가 MIN_HP, 즉 0보다 작아지면 'You are dead...' 로 출력하게 끔 했는데 사이에 Do Once 노드가 있다. 이것은 계속 이벤트유도를 하더라도 한번만 재생되게 하는 것으로 같은 조원분이 알려주셨다. 사실 죽었다는 문자가 피격키를 계속 누르면 누르는 만큼 나와서 마음에 안들었었는데 정말 적절하게 처리됐다.


문제.3

사실 For Loop을 쓰면 매우 편하게 구현할 수 있다. 하지만 While Loop는 같은 반복문임에도 불구하고 좀더 복잡하게 나왔다. 우선 A변수 초기값을 2로잡고 10미만으로 해서 2단부터 9단까지 반복할 수 있도록하였다. 곱해지는 수 역할인 변수 B는 1부터 9미만으로 설정했는데 솔직히 10미만으로 해야되지 않을까 싶은데 계속 10을 포함해 결과를 출력해서 줄였다. 자세한 이유는 아직 알지 못해서 내일 수업 때 물어봐야 되겠지만 현재 추측으로는 루프문은 completed를 통해 반복을 완료해야하는데 A는 컴플리트쪽으로 값을 반환해서 설정한 값 그대로 들어가지만 B는 따로 반환하지 않아서 ++ 증감한 값까지 나오지 않았나 생각한다. 결과는 퍼팩트!


문제.4

대망의 마지막 문제4 이문제가 가장 애를 먹였다. 문제를 보자.

열거형이 나왔다. 열거형은 변수안에 사용자가 원하는 값들이 모인 인수들의 집합이라고나 할까. 여튼 열거형으로 값으로 rock, scissor, paper로 넣었다. 일단 해답부터 보자.



희유.. 매우 길게 나왔다. 이 문제를 풀 때는 솔직히 switch 노드가 가장 먼저 생각이 났다. 코딩에서는 switch ~ case문이 있는데 if와(블루프린트에선 branch) 비슷한 성격이면서도 인수들을 하나씩 뽑아서 결과를 내는 느낌이라 경우의 수 관련 로직을 코딩할 때 편리했었다. 마찬가지로 블루프린트에서도 branch보다는 깔끔하게 switch가 깔끔하게 나올거라 생각했고 여기까진 좋았다. 그러나 아직 내 배움이 부족해서였을까 도저히 풀리지 않아서 웹서핑의 도움을 조금 받게 되었다. 우선 새로 배운 개념은 몇가지가 있지만 그중에 가장 도움이 됐던건 '커스텀 이벤트 노드' 이다. 이 노드는 언리얼엔진에서 정해진 것이 아닌 사용자가 직접 노드들을 매핑해서 작동방식을 설정할 수 있다. 거스텀 이벤트 노드들은 말그대로 이벤트를 유발하기도 하며, 다른 로직 중간에서 함수의 역할로도 사용되기도 한다.

이번 해답또한 PrintChoic가 Check Winner에 쓰이고 Check Winner이 마지막 승리판별하는 함수로도 쓰였다. 이렇게 하면 차칫 로직이 너무 커져 복잡해질 수 있는 것을 편하게 관리할 수 있다. 또 알게된것은 변환노드인데 일반적으로 코딩에서도 int에서 double을 쓸 때 규칙을 지키지 않거나 변환문자를 쓰지 않으면 오류가 나는것 처럼 블루프린트 또한 똑같았다. 그래서 열거형 노드에서 int 관련 노드로 들어가거나 포멧 택스트로 갈때는 변환노드가 필요했다. 언리얼 에디터에서 몇가지는 자동으로 붙여주지만 예외는 있었기에 계속 노드끼리 결합이 되지않아 애먹고 있었는데 이런 이유를 알고 나선 순식간에 코드를 완성할 수 있었다.




회고

오늘 뭔가 강의가 되게 휙휙 지나가고 프로그래밍 하는 지식이 조금 필요한 내용이여서 조금 힘들었던것 같다. 하지만 C 언어도 처음배울땐 멘붕이였지만 수 없이 반복하다보니 익숙해졌었던 것처럼 계속 부딪히면 바위같이 어려웠던 난관들도 조금씩 깎여나가 언젠가는 정복할 수 있는 날이 오지않을까 생각한다. 앞으로도 힘내자

profile
Unreal 1기

0개의 댓글

관련 채용 정보