본문 바로가기

언리얼/블루프린트

2024 언리얼 엔진 실무 기반 교육 과정 32일차

  • 블루프린트 기초
  • 이벤트
  • Remote Control
  • Transform
  • 위치 이동 이벤트
  • Branch
  • light (꺼졌다 켜지는 노드)
  • 레벨 이름 가져오는 노드
  • 외부 프로퍼티 가져오기

<블루프린트 기초>

 

블루프린트란 무엇인가?

- 언리얼 엔진의 비주얼 스크립팅 시스템

- 언리얼 에디터 안에서 노드 기반 인터페이스를 사용하여 게임 플레이 요소를 만드는 개념을 토대로한 비주얼 스크립팅 시스템

- 다른 언어와 마찬가지로 엔진 내 객체 지향형(OO) 클래스 또는 오브젝트를 정의하는데 사용

- UE4를 사용하다보면 블루프린트를 사용하여 정의된 오브젝트를 일상적으로 "블루프린트"라고 하는 경우가 많음

 

레벨 블루프린트

- 레벨 블루프린트란 단위 글로벌 이벤트 그래프 역할을 하는 특수한 형태의 블루프린트

- 프로젝트 내 각 레벨에는 기본적으로 자체적인 레벨 블루프린트가 있어 언리얼 에디터 안에서 편집할 수 있으나, 에디터 인터페이스를 통해 새로운 레벨 블루프린트를 생성할 수는 없음

- 레벨 전체적으로 관련된 이벤트 또는 레밸 내 특정 액터 인스턴스가 함수 호출이나 흐름 제어 연산 형태로 일련의 동작을 발동시키는데 사용

 

블루프린트 클래스(액터)

- 종종 그냥 블루프린트는 콘텐츠 제작자가 기존의 클래스 위에 다른 함수성을 쉽게 추가할 수 있도록 해주는 에셋.

- 블루프린트는 언리얼 에디터 안에서 코드 작성 방식이 아닌 시각적 방식으로 생성, 콘텐츠 패키지에 에셋으로 저장

- 본질적으로 새로운 클래스 또는 액터 유형을 정의하는 것으로 나중이 이 블루프린트를 맵에 인스턴스로 배치하면 다른 액터 유형처럼 작동함

 

애니메이션 블루프린트(애님 블프)

- 스켈레탈 메시의 애니메이션을 제어하는 특수 블루프린트

- 그래프는 애니메이션 블루프린트 에디터에서 편집하며, 여기서 블렌딩, 스켈레톤의 본 직접 제어, 로직을 구성하여 각 프레임에 사용할 스켈레탈 메시ㅐ의 최종 애니메이션을 최종 결정

 

블루프린트의 기본 요소

- 이벤트

- 노드

- 변수

- Set

- Get

- 레퍼런스 등등...


<이벤트>

- 시작점. 어떨때 시작할지에 따라 이벤트 노드의 이름이 정해진다.

- 가장 대표적인 것은 Event Begin Play와 Event Tick이 있다.

- Event Begin Play는 플레이 버튼이 눌렸을 때 한번 작동하고, Event Tick은 매 프레임마다 작동한다.

 

Begin Play - 게임이 시작될 때

End Play - 게임이 끝날 때

Actor Begin Overlap - 충돌이 시작될때

Actor End overlap- 충돌이 끝날 때

왼쪽 마우스 버튼 - 버튼을 누르거나 놓을때

왼쪽 Ctrl - 키를 누르거나 놓을때

Tick - 매 프레임마다

Custom Event - 사용자 정의 이벤트

 

블루프린트 클래스

- 어떤 클래스를 기반으로 생성할 것인지 선택할 수 있음

* 모든 클래스를 누르면 다른 클래스도 나옴

* 컨텍스트에 따라를 켜면 주로 사용하는 기능들을 위주로 띄워줌

* 블루프린트 클래스 디폴트 선택 후 입력 자동 수신 설정

  > 선택한 플레이어가 영향을 받음


A키를 누르면 위치가 뜨도록 하는 노드 연결

   > 키를 누르는 노드는 입력 자동 수신을 Player 연결을 해줘야 함

= 이렇게 뜸


블루프린트가 작동하는 상태

- 언리얼 엔진은 크게 2가지 상태로 나누어진다

- 플레이 상태와 에디터 상태

- 플레이는 플레이버튼 (시뮬레이션 버튼)을 눌러서 게임이 실행한 상태이고, 에디터 상태는 정지되어있는 상태

- 블루프린트는 기본적으로 플레이 상태에서 작동. 하지만 일부 블프는 에디터 상태에서도 작동.

- 블프가 어떤 상황에서 작동하는지 아는것도 중요하다.

- 뷰포트 플레이와 시퀀서의 플레이는 다름 (시퀀서는 시퀀서만 플레이) 하지만 렌더링을 하면 뷰포트의 플레이가 되기 때문에 시퀀서에서는 작동하지 않는 블루프린트가 작동한다.

 

노드

- 그래프에서 사용할 수 있는 이벤트, 함수 호출, 흐름 제어 동작, 변수와 같은 오브젝트

- 특정 그래프의 함수성이나 그 함수성이 들어있는 블루프린트를 정의하는데 사용

- 동작할 수 있는 "하나의 기능"

- 컨텍스트 메뉴 > 새로운 노드를 추가할때 현재 상황에 맞는 노드를 제시해주는 기능

- 팔레트 윈도우 > 블루프린트에서 사용할 수 있는 노드를 모아놓은 기능 

Mathew Wadstein Tutorials - YouTube

 

변수란?

- 월드에 있는 오브젝트나 액터에 대한 값이나 주소를 담는 프로퍼티

- 내부적으로는 그를 담고있는 블루프린트에서 접근할 수 있으며, 외부적으로 접근 가능하게 하여 레벨에 놓은 블루프린트 인스턴스 작업을 하는 디자이너가 그 값을 변경하도록 할 수도 있음

- 변수는 이름이 들어간 둥근 박스로 표시됨.

String - 자홍색 변수는 문자열 데이터, 또는 알파벳과 숫자로 된 글자 그룹을 나타냄

Vector - 금색 변수는 백터 데이터, 또는 XYZ나 RGB처럼 세개의 실수로 구성되는 요소나 축 정보

Boolean - 빨간 변수는 부울(진실/거짓) 데이터

Integer - 청록 변수는 0, 152, -226와 같은 정수 데이터, 또는 소수점이 없는 숫자

Object - 파랑 변수는 오브젝트, 즉 라이트, 액터, 스태틱 메시, 카메라, 사운드 큐를 나타냄

 

* 세팅된 값을 변수로 저장하고 싶을때

   > Promote to variable

+ 변수를 이런식으로 연결 가능

 

블프의 실행 순서

- 블루프린트는 하얀색 선을 따라 왼쪽에서 오른쪽으로 실행됨

- 이때 노드 안에 있는 변수를 만났을대 아래 그림과 같이 노드 안에 변수 값이 지정되어 있으면 그걸 실행하고, 핀이 연결되어 있으면 뒤로 가서 변수를 확인하고 다시 돌아오게 됨

* 변수를 확인하고 돌아옴-


변수 응용

-뷰포트에 큐브 추가, 디테일>렌더링 > 표시 비활성화

- A를 눌렀을때 표시를 꺼둔 cube가 보이도록 하는 노드 연결

- B버튼을 눌렀을때 New Scale의 값만큼 크기가 변하는 노드

* 노드의 Component와 Actor를 구분해야함

* 값을 넣을 수 있는 변수는 인스턴스 편집 가능 활성화를 해줌

> 밖의 블루프린트 액터 - 디폴트에 추가됨

* 블루프린트 왼쪽 하단에서 +버튼을 눌러 함수 추가 가능


<Remote Control>

플러그인 > Remote Control API 활성화

  > 따로 창을 띄워 필요한 설정만 넣어놓을 수 있는 기능

  > 라이브 상황에서도 사용할 수 있다.

- 콘텐츠 브라우저 우클릭 > 원격제어 > 리모트 컨트롤 프리셋

- +를 눌러 그룹 추가 가능

- 디테일창에서 눈을 눌러 프로퍼티를 추가해줄 수 있음

- 아래 F를 눌러 함수를 추가해줄수도 있음


<Transform>

- 블루프린트 생성 > Set Actor Transform 생성

- 트랜스폼이 연결되어있지 않으면 오류가 남

  > 변수에 현재 위치 기본값을 적어줌

- Relative > 자신의 위치에서 이동

   > 위치를 따로 지정해주지 않아도 됨 (편리)

> Tick에 붙이면 매 초마다 움직이므로 이 경우엔 Add Actor Local Offset을 추천

 

Add Actor Local Rotation

- 해당 블루프린트가 계속 돌아감

- Target에 특정 변수를 연결하면 그 오브젝트만 돌아감.

 

타임라인

- 노드를 두번 클릭하면 창을 한번 더 들어갈 수 있음

- 트랙 > 플롯 트랙 추가

- 그래프 우클릭 > 커브플롯에 키 추가

- 시간과 값 설정

- 타임라인을 확인할땐 Print String을 사용하는 것을 추천

- 그래프에서 값을 1을 주었기에 외부에서 Multiply로 값을 넣어줄 수 있음

  > Multiply의 B값을 변수로 바꾸어 인스턴스 편집 가능을 켜주면 외부에서도 손쉽게 수정할 수 있음

- Print String대신 Set Actor Relative Location 넣기

- 구조체 핀 분할하여 원하는 곳에 각각 노드를 연결 할 수 있음


Reverse From End > 타임라인을 되돌림

- 올라갔다가 제자리로 돌아와야하므로 기존 타임라인 노드의 Finished를 복사한 노드들의 Reverse from End와 연결해준다.

= 위로 올라갔다 내려옴


위치 이동 이벤트

- Add Custom Event 생성

- 타임라인과 연결한다

- 위치이동 실행중이라는 부울 변수를 만들어준다

- Set로 가져옴

- Set Actor Relative Location의 XYZ값을 분리해주고 이동과 연결

- 그 사이에 Multiply를 곱하고 곱하는 수를 변수로 승격시켜준다. (편하게 수치를 변경하기 위함)

- Flow Control 아래의 Sequence를 생성해서 Event Tick에 연결

   > Sequence는 여러 이벤트를 동시에 실행시켜주는 노드

- Sequence에 Branch를 연결해준다.

- 위치 이동 실행중의 Condition변수를 생성해 연결

- Branch False에 위치이동시작 함수를 연결(위에 만든 위치이동시작 이벤트)

- 타임라인의 Finished에 위치이동시작 변수를 Set으로 가져오고 그 뒤에 확인을 위한 Print String을 붙임

- 확인 후 제자리로 돌아오는 오브젝트를 위해 타임라인을 복사해 올라가는 타임라인의 Finished에서 돌아오는 타임라인의 Reverse from End로 연결한다.

- 제자리로 돌아오는 타임라인의 Finished에서 Delay를 연결해 Print Spring 노드를 연결해준다.

 

* 총 노드 정리


Branch

- Event Tick에 Sequence생성

- Branch에 만든 Condition 변수를 연결한다.

- Branch의 각 끝에 Print String을 각각 연결해준다.

- Sequence의 다른 노드에 Delay노드를 연결하고 Flip Flop노드를 추가로 연결 후 Set condition을 각각 연결해준다.

   > Flip Flop노드의 특성으로 번갈아가며 Branch노드의 결과값을 출력 > True False의 값이 번갈아가며 출력된다.

- 새로운 Custom Event를 생성하고 Print String을 연결한다

- 아까 생성한 Branch의 print string의 끝에 뭔가 실행중(생성한 커스텀 이벤트 함수)를 연결한다

- Custom Event에 Set Condition을 연결하고 Print String - Delay - Set Condition을 연결한다

  > Set 노드들로 중간 이벤트가 시작되고 끝남을 표시해주는 역할


 

light

- 타임라인 생성 후 빛이 켜질 그래프 생성

- Custom Event를 생성 후 타임라인의 Play from Start에 연결한다

- Set Intensity를 타임라인의 Update에 연결

  > 뷰포트에서 추가한 포인트 라이트의 변수를 Target에 연결

- 타임라인의 트랙에 Multiply를 연결하고 Set Intensity의 New Intensity에 연결한다.

  > Multiply의 곱해주는 수를 변수로 승격해준다.

- 불 끄기 Custom Event를 만들땐 불켜기의 노드들을 복사해 Reverse from End에 이벤트를 연결해준다.

- point light의 변수에서 핀을 뽑아 Get Intensity를 검색해 연결한다.

- Intensity에서 핀을 뽑아 Promote to variable을 눌러 변수로 승격해준다.

  > 플레이가 되자마자 라이트의 현재 밝기를 인식하기 위함

- Set intensity를 Begin Play와 연결 후 Print String과 연결

- Append 노드를 생성해 Print String과 Set intensity의 노드에 각각 연결

  = ex) 현재 라이트의 밝기는 10입니다

Branch에 연결된 Condition에따라 불을 껐다켰다하기

- Custom Event 생성 후 Greater를 생성 후 위에서 만든 현재 라이트의 밝기 변수를 불러온다

   > 현재 라이트의 밝기가 0보다 크면 True, 작으면 False로 작동

- 각각 위에 만들어둔 불이 켜지고 꺼지는 노드를 각각 복사해온다.

   > 이때 불이 켜져있으면(True) 불이 꺼져야 함으로 불이 꺼지는 노드를 복사해온다.

   > 불이 꺼져있으면 (False) 불이 켜져야 함으로 불이 켜지는 노드 복사

- New Var의 값을 0이상으로 설정해준다

- 각각의 Set intensity의 Target에서 핀을 뽑아 Get Intensity를 연결해주고 Set Intensity 노드를 생성

- 위에 생성된 Set Intensity의 노드를 타임라인의 Finished에 연결해준다.

   > 다시 버튼을 눌렀을때 Begin play에 연결된 현재 라이트의 밝기를 파악하기 위함

* 불의 밝기가 잘 안보일땐 포인트 라이트의 강도 유닛을 Candelas로 변경


레벨이름가져오기

Construction Script

- 레벨에 놓이면 바로 실행

- Get Current Level Name 생성

   > 레벨의 이름을 불러오는 노드

- Print String으로 출력로그에 레벨 이름이 뜰 수 있도록 함 

  > 창 - 출력로그

- Split 노드로 _ 오른쪽, 왼쪽의 단어를 각각 연결

  > Switch on String에 인덱스 추가

- 해당 노드는 _의 Right에 있는 단어에 따라 출력되는 글이 달라짐

= 출력되는 로그

* Print Spring에 Set Visibility를 연결하여 실내, 실외에따라 도형이 사라지게 할 수 있음


외부 프로퍼티 가져오기

- Custom Event 생성

- Get Actor of class

  > BP의 값을 가져오는 노드

- Get Component by class

  > 레벨에 있는 액터를 가져오는 노드

- Return Value에서 핀을 뽑아 Get intensity (불러온 포인트 라이트의 Intensity값)를 생성

- Print String에 연결

= 이벤트 발생시 BP_light의 포인트라이트 Intensity값이 출력됨