Blueprint
언리얼 엔진 내의 비주얼 스크립팅 시스템
노드 기반의 인터페이스
언리얼엔진은 크게 2가지 상태로 나뉜다.
Play 상태와 Editor 상태
블루프린트는 기본적으로 Play 상태에서만 작동한다. ( 일부 에디터 상태에서 실행되거나 플레이 상태에서 작동하지 않는(에디터 유틸리티 위젯)블루프린트도 있다. )
* 시퀀서에서 확인 시 블루프린트가 작동하지 않지만 렌더링을 거는 순간 Play 상태로 렌더되기 때문에 블루프린트가 결과물에 출력된다.
대표적인 블루프린트
<레벨 블루프린트>
Level Blueprint (레벨 블루프린트)란 레벨 단위 글로벌 이벤트 그래프 역할을 하는 특수한 형태의 블루프린트 입니다. 프로젝트 내 각 레벨에는 기본적으로 자체적인 레벨 블루프린트가 있어 언리얼 에디터 안에서 편집할 수 있으나, 에디터 인터페이스를 통해 새로운 레벨 블루프린트를 생성할 수는 없습니다.
레벨 전체적으로 관련된 이벤트 또는 레벨 내 특정 액터 인스턴스가 함수 호출이나 흐름 제어 연산 형태로 일련의 동작을 발동시키는 데 사용됩니다.
<블루프린트 클래스(액터)>
Blueprint Class (블루프린트 클래스), 종종 그냥 Blueprint (블루프린트)는 콘텐츠 제작자가 기존의 클래스 위에 다른 함수성을 쉽게 추가할 수 있도록 해 주는 애셋입니다. 블루프린트는 언리얼 에디터 안에서 코드 작성 방식이 아닌 시각적인 방식으로 생성되며, 콘텐츠 패키지에 애셋으로 저장됩니다. 이는 본질적으로 새로운 클래스 또는 액터 유형을 정의하는 것으로, 나중에 이 블루프린트를 맵에 인스턴스로 배치하면 다른 액터 유형처럼 작동합니다.
<애니메이션 블루프린트(애님블프)>
애니메이션 블루프린트(Animation Blueprints) 는 시뮬레이션 또는 게임플레이 도중 스켈레탈 메시(Skeletal Mesh) 의 애니메이션을 제어하는 특수 블루프린트 입니다. 그래프(Graphs) 는 애니메이션 블루프린트 에디터(Animation Blueprint Editor) 안에서 편집되며, 여기서 애니메이션을 블렌딩하거나 스켈레톤의 본을 제어하거나, 각 프레임에 사용할 스켈레탈 메시의 최종 애니메이션 포즈를 정의할 로직을 생성할 수 있습니다.
<시퀀서 블루프린트>
시퀀서에서 사용하는 블루프린트
Blueprint 구성요소
이벤트
이벤트 노드 - 시작점( 인풋 탭이 없다. 흰색 화살표). 어떨 때 시작할지에 따라 이벤트 노드 이름이 정해진다. 노드가 실행될 때 '호출된다'라는 표현을 쓴다.
Event Begin Play - Play 상태에 진입할 때 한 번 실행
Event End Play - Play 상태가 종료될 때 한 번 실행
Event Actor Begin Overlap - 액터가 겹치는 시작점에 한 번 실행
Event Actor End Overlap - 액터가 겹쳤다 떨어지는 끝점에 한 번 실행
Event Tick - 특정 주기로 계속해서 실행
Custom Event - 사용자 정의 이벤트
Mouse input 이나 Keyboard input을 이벤트로 사용할 수도 있다.
마우스나 키보드 input을 이용할 때는 블루프린트의 클래스 디폴트 - 디테일창 - 입력 - 입력 자동수신을 해당 Player로 맞춰준다.(보통 캐릭터 1명일 때 Player0)
또는 레벨에 배치한 블루프린트의 디테일창에서도 같은 옵션을 찾을 수 있다.
노드
컨텍스트에 따라 - 활성화 시 노드 연결에 자주 사용하는, 활용할 수 있는 노드를 골라서 보여준다.
팔레트 - 노드 생성 시 검색했던 목록이 사라지지 않아서 편리, 즐겨찾기 기능
Print String - 문구를 출력해주는 노드. 디버깅용 값 출력 시에도 자주 사용
변수
월드에 있는 오브젝트나 액터에 대한 값이나 주소를 담는 프로퍼티입니다. 이 프로퍼티는 내부적으로 그를 담고 있는 블루프린트에서 접근 가능하며, 외부적으로 접근 가능하게 하여 레벨에 놓은 블루프린트 인스턴스 작업을 하는 디자이너가 그값을 변경하도록 할 수 있다.
노란색 핀은 vector 값
다홍색 핀은 string 값
분홍색 핀은 text 값
보라색 핀은 rotator 값
주황색 핀은 Transtorm 값
빨강색은 boolean 값
청록색은 interger(정수) 값
연두색은 float(실수) 값
파랑색은 Object(actor) 값 : Object란 라이트, 액터, 스태틱메시, 카메라, 사운드 큐 등
<노드의 핀을 변수로 바꾸는 법>
1.변수로 바꾸고자 하는 핀을 길게 끌어 빈 공간에 놓고 검색창이 뜨면 Promote to Variable 선택
2. 변수로 성공적으로 바뀌면 블루프린트 에디터 내 내 블루프린트 창에서 변수에 새로운 값이 생긴 것을 확인할 수 있고, 노드의 핀에 Set이라고 쓰여있는 노드가 새로 생기는 것을 볼 수 있다.
3. Set에서 변수의 값을 지정 받으면 변수를 get으로 가져와서 특정 이벤트와 연결하여 로직을 짤 수 있다.
프로퍼티 조작 실습
1. Visibility toggle & scale 조작
액터 블루프린트 생성.
컴포넌트에 큐브와 스피어를 추가해주고
각 컨포넌트는 디테일창에서 렌더링 - 표시를 해제해준다.
* 노드 이름에서 '액터'인 것과 아닌 것 구분하기, 액터 블루프린트에서 액터란 블루프린트 자체이고, 블루프린트 안에서 생성한 Cube와 Sphere는 컨포넌트이므로 액터라고 쓰여진 노드에 컨포넌트를 연결 할 수 없다.
이벤트 그래프로 돌아와서 keyboard input A와 B를 만들어주고, 각 키를 누르면 Visibility와 Scale이 바뀌도록 관련 노드를 달아준다. Target에는 컴포넌트를 끌어다 놓으면 변수로 불러와지고 연결.
추가적으로 스케일을 블루프린트 밖 에디터 상태에서 수정하기 위해서 New Scale 핀을 변수로 승격해주고,
변수로 생성된 스케일 변수를 디테일 창에서 인스턴스 편집가능 체크하여 밖에서 수정가능 하도록 노출 시켜준다.
블루프린트 컴파일, 저장 후 밖에 나가보면 레벨에 올려놓은 블루프린트의 디테일 창에 스케일 변수가 노출되어있는 것을 확인 할 수 있다.
게임 중에 디테일 창 조작 설정 ( Remote Control API)
플러그인에서 Remote Control API를 활성화, 재시작.
컨텐츠 브라우저 우클릭 - 원격제어 - 리모트 컨트롤 프리셋 생성
생성된 리모트 컨트롤을 열면 디테일 창의 프로퍼티들 옆에 눈 모양이 생기는데, 눈 아이콘을 켜주면 원격제어 할 수 있도록 목록이 추가된다. 눈 표시 있는 것은 모두 추가 가능.
원격제어에는 함수도 호출하여 원격제어가 가능한데, 다시 블루프린트로 들어가서 내 블루프린트 - 함수 - + 버튼 새 함수 생성. 이름 설정해주고 새로 생긴 함수 그래프에 로직을 짜준다.
함수를 클릭한 상태에서 디테일 창을 보면 에디터에서 호출을 체크 해주고, 블루프린트 컴파일 저장.
다시 원격제어로 돌아와서 창의 하단 함수아이콘 - 액터 함수 - 앞서 생성한 함수를 불러와준다.
함수를 불러오면 목록에 추가되며 함수 호출 버튼을 클릭하여 앞서 정의했던 함수 로직이 실행되도록 할 수 있다.
이 기능을 이용하면 특정 이벤트와 연결하는 것과 별개로 로직 자체를 제어할 수 있는 컨트롤러를 생성하게 되는 것이다.
프로퍼티 조작 실습
2. Transform 조작 (Event BeginPlay)
타임라인 이용하기 (시간에 따른 값의 변화)
블루프린트 이벤트 그래프에 Timeline 노드 생성. Event BeginPlay에 Timeline 연결
Timeline 노드를 더블 클릭하면, Timeline 그래프를 설정할 수 있는 창으로 들어간다.
+ Track을 클릭하여 Float 트랙을 추가해주고 그래프 위에서 우클릭 - CurveFloat_0에 키 추가로 원하는 만큼 키를 추가해준다.
예시에서는 시간은 0~5초, 값은 0 ~ 1 값이 되도록 설정해준다.
* 타임라인 출력값을 0~ 1로 설정하는 이유 : 외부에서 변수 노출 시켜서 곱하면 값을 쉽게 응용할 수 있기 때문이다.
key에 대고 우클릭하면 그래프의 탄젠트를 조절할 수 있다.
트랙의 이름은 '변하는 값'이라고 변경해줬다.
다시 이벤트 그래프로 돌아와서, 타임라인에 변하는 값이라고 하는 새로운 출력핀이 생기는 것을 볼 수 있다.
변하는 값에 Multiply, 변수로 값을 응용가능하게 로직 추가.
타임라인의 Update에는 set actor relative location 노드를 달아 변하는 Multiply에서 나오는 값을 X,Y,Z 축 중 원하는 핀에 넣어준다. (*구조체 핀 분할은 아래에 설명 추가)
위의 타임라인의 Finished를 아래 타임라인의 Reverse from End에 달아주면 이동했다가 다시 돌아오는 동작을 구현할 수 있다.
set actor relative location 노드 : actor를 새로운 위치값으로 바꾸어 준다.
(*구조체 핀 분할은 아래에 설명 추가)
백터로 된 핀을 우클릭 - 구조체 핀 분할하면 각각 실수값을 받는 핀으로 분리가능하다.
프로퍼티 조작 실습
3. Transform 조작 (Event Tick)
타임라인은 Event Tick에 바로 붙이면 안된다. 타임라인이 update될 시간을 확보해주어야 된다.
'위치이동실행중'이라는 부울 변수 생성
커스텀 이벤트 생성. '위치이동시작'
print string을 달아 이동 시작 확인
'위치이동실행중'이라는 변수를 set으로 가져와서 True로 만들어준다. (*타임라인이 진행되는 중에 event tick이 진행되지 않도록 막는 역할을 한다. 자세한 설명 아래에서)
timeline 노드와 set actor relative location 노드를 이용해 움직임을 왕복 반복하는 로직을 만들어준 후
마지막 timeline 노드가 끝나면(finished) '위치이동실행중'이라는 변수가 다시 False값이 되도록 설정해준다.(* event tick이 진행되도록 하는 역할)
Event Tick에 sequence 노드를 연결.(Event tick에 여러 흐름의 로직이 있을 경우 한번에 여러 실행을 하기 위한 조치)
delay 노드 연결로 play시작 후 2초의 연결 텀을 줘 보기 편하게 해준 후
branch 노드에 '위치이동실행중'이라는 변수를 조건으로 달아 변수가 바뀜에 따라 custom event가 실행될 수 있도록 한다.
4. Branch와 Flip Flop 활용
Branch : 조건문을 만드는 노드
Flip Flop : A와 B를 번갈아서 실행하는 노드
Delay : 노드 진행을 설정 시간(단위 초)만큼 늦춰주는 노드
5. Light 제어
현재 Intensity 값을 기반으로 불을 끄거나, 불을 켜는 로직 구현 ( 타임라인을 이용한 )
Custom Event를 2개 생성하여 불끄기, 불켜기 Event를 각각 생성.
Timeline 노드 생성 0~5초, 0~1값을 가지는 Float 트랙을 생성해주고 각 Event 노드에 연결해준다.
불켜기는 Play from Start, 불끄기는 반대로 진행되는 Reverse from End에 연결.
트랙에서 나오는 결과값은 값의 응용을 위해 Mutiply노드를 추가로 달고 하나는 트랙 출력값에, 다른 입력은 변수로 승격 후 변수 디테일 창에서 인스턴스 편집가능을 체크하여 블루프린트 밖에서도 수정가능하도록 해준다.
최종 값을 point light가 타겟인 set intensity 노드를 만들어서 New Intensity 값에 연결해준다.
마지막으로 타임라인이 모두 진행되고 끝나면 다시 현재 라이트값을 업데이트 하기 위해
변수로 만들었던 현재 라이트 Intensity를 Set으로 가져오고, 다시 Point Light의 값을 구하는 Get Intensity 로직을 짜 타임라인이 Finished됐을 때 진행되도록 연결해준다.
위에서 만든 불끄기, 불켜기 로직을 현재 라이트 Intensity가 변함에 따라 자동화하기 위해서 로직을 추가해준다.
custom Event를 만들고 Light Change로 이름을 바꾼다.
Branch 노드에 연결하여 조건을 달아주는데, 연산자의 Greater노드를 이용하여 (변수)현재 라이트 Intensity가 0보다 크면 Branch True에 불이 꺼지게, 0이랑 같거나 작으면 Branch False에 불이 켜지게 연결해준다.
마지막으로 Play 상태에 진입할 때 최초의 (변수)현재 라이트 Intensity를 가져오기 위해서
Event BeginPlay에 Set 현재 라이트 Intensity와 Get Intensity(Point Light)을 이용해 변수 세팅을 해준다.
최종 로직
Custom Event - 디테일 창 에디터에서 호출을 체크해주면, 레벨에 올린 블루프린트디테일창에서 버튼으로 작동 시켜줄 수 있다.
6. Event actor begin Overlap
블루프린트 액터 생성.
컴포넌트에 SpotLight와 SpotLight 아래 Box Collision을 추가해준다.
이벤트 그래프에서 Event Actor Begin Overlap에 print string을 달아주면 콜리전 영역에 액터가 overlap 되는 순간에 문구가 출력되는 것을 알 수 있다. overlap되는 액터는 시뮬레이션이어도, 레벨 시퀀스 상에서 key가 잡힌 액터여도 인식이 된다.
부딪혀질 actor의 디테일 창에서 오버랩 이벤트 생성을 체크해주어야한다.
Overlap되는 Actor의 정보도 가지고 올 수 있다. (ex> 특정 타입에만 문이 열리는 자동문)
Event Actor Begin Overlap의 other actor 핀과 Get Display name 노드 등을 이용하면 현재 블루프린트와 겹쳐진 Actor의 정보를 가지고 올 수 있다.
7. 레벨 이름 가지고 오기
액터가 놓여져 있는 레벨의 이름을 불러올 수 있다.(ex> 액터가 놓여진 레벨에 따라 악세사리 변경 or 상태 변경 등)
Play 상태가 아니라, 컴파일 시 또는 액터가 레벨에 놓임과 동시에 실행하는 노드는
Construction script에서 작업해야한다.
Get Current Level Name : 현재 레벨 이름 가져오기 노드
해당 출력 값은 창 - 출력로그에서 확인할 수 있다.
레벨의 이름을 구분해서 작동하도록 업그레이드.
Split 노드를 이용하면 String으로 된 출력값을 특정 문자를 기준으로 왼쪽 또는 오른쪽 문자열을 출력할 수 있다.
레벨 이름 끝에 '_out'이 붙도록 이름 붙여주었다고 가정하에, Split의 in str에 '_'를 넣어주고 Search Dir은 'From End'로 변경.
이어서 Switch On String 노드를 이용하면 문자열에 따라 실행되는 로직을 만들 수 있다.
Switch On String의 핀을 두 개 추가하여 out과 in으로 변경. out일 때는 '야외씬입니다.', in일 때는 '실내씬입니다.'가 출력되도록 print string을 달아주면 완성. 이후 로직은 자유.
블루프린트 컴파일. 저장 후 레벨에 올리면 출력 로그에서 레벨 이름에 따라 문구가 출력되는 것을 볼 수 있다.
8. 블루프린트 외부의 액터 정보 가져오기
커스텀 이벤트 노드 생성. ( 에디터 호출 활성화)
Get Actor of Class 노드로 레벨에서 불러오고 싶은 액터 블루프린트를 찾아주고,
Get Component by Class 노드로 불러온 블루프린트 안의 컴포넌트를 찾아준다.
이후 가져오고자 하는 프로퍼티와 연관된 노드를 연결해주면 현재 블루프린트에 없는 액터의 정보도 가지고 올 수 있다.
<참고영상>
https://www.youtube.com/watch?v=zaVY5A0hqiI&list=PLZlv_N0_O1ga2b_ZaJoaR5dLHOFw4-MMl
https://dev.epicgames.com/community/learning/paths/0w/unreal-engine-beginplay
https://www.youtube.com/@MathewWadsteinTutorials
'Unreal Engine' 카테고리의 다른 글
Unreal Material - 07 (0) | 2024.05.23 |
---|---|
Unreal Animation & Sequence -01 (0) | 2024.05.22 |
Unreal Lighting & Camera - 05 (0) | 2024.05.20 |
Unreal VFX - 01 (0) | 2024.05.17 |
생성형 AI - 05 (0) | 2024.05.10 |