시작하기 전...
온라인 강의를 들으며 의문이 들 때마다 메모장에 정리했고
그에 대한 답안도 영상을 보며 생각하고 저만의 말로 정리했습니다.
정리한게 틀리면 안되니 Gpt에게 첨삭도 받았습니다.
저번 편까지는 언리얼 엔진의 대략적인 기능에 익숙해지는 시간이었다면
이번에는 그 중 블루프린트 노드 생성 방법과 종류, 어떻게 연결하면 되는 지,
레벨 블루프린트에 대해 정리해 보았습니다.
그래픽으로 구성된 노드를 사용해서 게임 로직이나 상호작용을 만드는 도구입니다.
프로그래밍 언어를 직접 쓰지 않아도 노드란 것을 연결해서
"이벤트가 발생하면 어떠한 일이 일어나도록" 설정할 수 있습니다.
블루프린트의 특정 작업이나 행동을 정의하는 작은 블록입니다.
그 작은 블록 하나에 코드 로직이 포함되어 있습니다.
이 작은 블록들이 모여 게임의 큰 로직을 구성합니다.
특정 상황(이벤트)이 발생했을 때 어떤 작업이 실행될지를 정의하는 구조입니다.
EventGraph는 블루프린트에서 이벤트를 트리거로 로직을 실행하는 공간입니다.
트리거란?
어떤 일이 일어나면 실행되는 동작의 시작 신호를 보내주는 장치입니다.
여러 기능을 모아서 하나의 기능으로 만들어주는 코드 블록입니다. 예시로 밥 먹기, 씻기, 잠 자기 같은 행동이 있다면 그것을 밥 먹고 씻고 잠자기 같은 행동으로 만들어 주는 것이 함수입니다.
코드 블록이란?
하나의 작업을 수행하기 위해 묶여있는 코드의 집합체입니다.
Override(오버라이드)란?
기존에 이미 정의된 함수들을 덮어씌우거나 추가할 수 있습니다.
블루프린트에서 매크로는 입력을 다른 형태의 출력으로 변환해주는 것입니다. 예시로 "1을 넣으면 2배로 만들어 준다."와 같은 내용이 매크로 그 자체입니다.
원래 알고 있는 뜻의 매크로 역할도 있습니다.
반복적인 작업을 할 때 미리 설정해두고 매크로를 불러 올 수 있습니다.
데이터를 저장하기 위한 이름이 붙은 공간으로 정수, 실수, 문자열 등
다양한 데이터 타입(종류)을 저장할 수 있습니다.
<변수의 데이터 타입>
Integer(인티저)
정수(음수, 양수, 0을 포함하는 모든 값)를 가집니다.
Bool(부울)
Bool은 Boolean의 줄임말로 true(1) 혹은 false(0)값을 갖는
논리 자료형입니다. 주로 조건문에서 많이 쓰입니다.
Vector(벡터)
3개의 float(실수)로 구성됩니다. 가로, 세로, 높이 3방향을 나타내는 x,y,z에 각각의 값을 넣을 수 있는 자료형입니다.
주로 3D 공간에서 위치, 방향, 크기를 조정할 때 쓰입니다.
Float(플로트)
소수점이 포함될 수 있는 실수의 데이터 타입입니다.
배열
같은 데이터 타입의 자료형들을 여러 개 묶어 놓은 것입니다.
이벤트 디스패처는 나중에 충분히 공부한 후 블로그에 올리겠습니다.
어떠한 작업이 실행되는 노드에 순서를 정해줍니다.
노드를 계속 이어가려면 가로로 추가해야 되는데
그러면 너무 길어지니까 만들어진 것이 Sequence입니다.
해당 노드가 작동하려면 Boolean 변수가 필요합니다.
false(0), true(1)가 부울의 값으로 들어갈 수 있습니다.
참일 때는 계속 실행시키고
거짓일 때는 코드가 Loop문에서 계속 돌다가
completed가 실행되며 밖으로 빠져나가며 종료됩니다.
While Loop에서 condition은 무엇일까요?
반복문이 실행될지 멈출지를 결정하는 조건을 의미합니다!
조건이 맞으면 true,
조건이 틀리면 false를 실행시킵니다.
first index가 last index에 도달할때 까지 반복합니다.
For Loop에 Break기능이 추가된 것입니다.
중간에 Branch를 추가하면 break 기능을 사용해
index가 branch의 조건을 만족할때 for loop의 반복을 중지합니다.
배열을 받아 생성하는 for문입니다.
Array index - 만든 배열 요소의 번호(순서)입니다.
Array Element - 요소가 가진 값들입니다.
6번의 For each Loop를 쓰기 위한 배열 생성 노드입니다.
실습을 통해 노드의 생성 방법을 정리했습니다.
이벤트 그래프에서 빈 화면에 우클릭을 합니다.
원하는 노드를 고르고 만들 수 있습니다.
아래 사진에서 화살표가 가리키는 부분이 핀입니다.
핀은 노드와 노드를 연결시키는 중요한 요소입니다.
우클릭과의 차이점은, 노드가 생성될 때 핀과 핀이 이미 연결된 상태로 만들어진다는 점입니다.
드롭다운은 가져올 요소를 드래그로 끌어서 화면에 가져다 놓는 것입니다.
드래그 후 내려놓기(drop down) 때문에 드롭다운입니다.
왼쪽의 함수, 매크로, 변수 등을 드롭다운할 수 있습니다.
반드시 Unreal Engine의 'Content' 폴더 안에 저장해야 합니다. 이 폴더 외의 위치에 저장할 경우, 프로젝트에서 제대로 인식되지 않을 수 있습니다!
Print String 노드를 선택하고 배치하면 됩니다.
개발전용
실제 게임에서는 문자열이 출력되지 않습니다. 개발자가 개발을 하는 화면인
언리얼 엔진 에디터에서만 출력됩니다.
실제 게임에서는 문자열이 U.I(User Interface)를 통해 출력되는데
일단 넘어갑시다.
Print노드의 값이 나타나는 순서
먼저 실행된게 아래, 나중에 실행된 게 위쪽에 표시됩니다.
변수를 드롭다운하면 이런 창이 뜹니다.
Set Var1은 선택한 변수의 SET 노드 생성, Get Var1은 GET 노드를 생성합니다.
간단히 말해 SET은 변수의 값을 설정,
GET은 그 변수의 값을 가져올 때 쓰는 역할입니다.
위에서 GET노드와 Print노드 사이에 변환 노드가 자동으로 생성되었습니다.
하지만 자동으로 변환 노드가 생성되지 않을 때는?
프로그래머가 직접 변환 과정을 구현해야 하는 경우도 있습니다.
이번엔 함수 옆에 있는 +버튼을 눌러 함수를 추가했습니다.
아 그리고 컴파일을 눌러줘야 블루프린트가 저장됩니다.
BeginPlay 노드에 Start Study 함수 연결 → 컴파일 후 실행하면?
우선 Sequence와 Branch 노드는 "flow"로 검색해 찾을 수 있습니다.
While Loop, For Loop, For Loop with Break 노드는
"흐름"으로 검색해 찾을 수 있습니다.
For each Loop는 "배열"으로 검색하거나 그냥 "For each"를 검색하면 됩니다.
근데 노드 종류의 이름을 잘 기억하고 있다면
Branch면 br, Print String이면 p st
이런식으로 검색하는 게 더 빠릅니다.
아래 사진처럼 1, 2, 3이 순서대로 실행되게 만들었습니다.
하지만 Print노드에서는 먼저 실행된 게 아래, 나중에 실행된 게 위로 가기 때문에
3, 2, 1 순서로 보일 것입니다.
강의 영상을 보고 똑같이 따라해봤습니다.
노드에서 작업이 어떤 흐름대로 흘러가는 지 파악한다면 노드끼리의 연결은 자연스럽게 가능할거라 생각합니다. 그래서, 흐름을 파악해 보았습니다.
1. Event BeginPlay가 레벨 시작 시 실행됩니다.
SET이 다음으로 실행됩니다.
2. SET(var1)에서 var1이 0으로 설정됩니다.
GET이 다음으로 실행됩니다.
3. SET(condition)에서 Condition을 설정합니다.
While Loop가 다음으로 실행됩니다.
4. While Loop에서 Condition이 true라면 Loop Body를 실행하고
false면 Completed가 실행됩니다.지금은 Condition이 true니까 Branch가 다음으로 실행됩니다.
5. Branch에서 조건을 확인 후 true면 true랑 연결된 "다음 노드" 실행,
false면 false랑 연결된 "다음 노드"가 실행됩니다.지금은 Condition이 0이고, 조건을 만족하니 true입니다.
true와 연결된 SET(var1)이 실행됩니다.6. SET(var1)에서 현재 설정된 var1의 값에 1을 더해준 값을 설정합니다.
Print String이 다음으로 실행됩니다.
7. Print String에서 "반복중.." 을 출력하고 다시 While Loop문으로 돌아갑니다.
참고로 While Loop 노드랑 연결되었고 실행 기준 가장 끝의 노드가 실행하는 작업이 끝나면 다시 While Looo 노드로 돌아갑니다.
8. Branch에 연결된 조건인 "var1 < 3"의 조건이 false가 될 때까지 4~7번을 반복합니다.
여기서는 var1이 3이 되면 "3 < 3"은 논리적으로 말이 안됩니다.
그래서 false값이 나오고 Branch에서 false랑 연결된
SET(Condition)이 실행됩니다.9. SET(condition)에서 Condtion이 false로 설정됩니다.
이제 끝 노드에 다다랐으니 While Loop로 돌아갑니다. 하지만 Condition이 false라 이전과는 다르게 While Loop의 Loop Body가 아닌 Completed와 연결된 노드가 실행됩니다. 그 노드는 Print String(끝!!)입니다.
10. Print String(끝!!)에서 "끝!!"을 출력합니다.
이제 While Loop문이 Completed(완료)되었기 때문에 다시 돌아가지 않고
노드의 실행이 마무리됩니다.11. 결과를 예측해 봅시다.
아마 var1이 0, 1, 2로 설정될 때마다 "반복중.."이 출력되고
var1이 3으로 설정되었을 때 "끝!!"이 출력될겁니다.
그러면 결과는..
반복중..(0)→반복중..(1)→반복중..(2)→끝!!(3)지만
먼저 실행된 게 아래에서 출력되니 최종 결과는
끝!!
반복중..
반복중..
반복중..
이제 기본적인 흐름 파악 능력이 생겼으니 나머지는 따라만 해보겠습니다.
Branch, 조건 노드가 없었다면 0, 1, 2, 3, 끝이 출력되었을겁니다.
Branch와 조건 노드를 봅시다.
index의 값이 2랑 같아지면 Branch의 Condition이 true가 되어서
Branch의 true랑 연결된 핀인 Break가 실행됩니다.
For Loop with Break에서 Break가 실행되면 For Loop with Break에서 모든 작업이 끝났기 때문에 Completed로 넘어갑니다. Print String의 값을 출력하게 됩니다.
그렇게 노드의 실행이 마무리됩니다.
Make Array에 true로 값을 몇 개 체크했는데 Branch의 조건이 True인 것만 Print String에 출력되기 때문에 체크한 값인 0, 1, 4만 나오게 될겁니다.