실감 기본편 언리얼 엔진 블루프린트 기초
GCC 사관학교
안녕하세요
블루프린트 강의를 담당하게 된 탁광욱입니다
블루프린트는 언리얼 엔진을 다루면서
굉장히 많이 다루게 될 시스템인데요
복잡한 액터를 설계하고 고안된
언리얼만의 고유 설계 시스템을 의미합니다
이 블루프린트는 외형뿐만 아니라
기능들도 동작할 수 있도록 추가할 수 있는데요
이번 시간에는 블루프린트의 기능에
집중해 보도록 하겠습니다
먼저 블루프린트의 비주얼 스크립트에 대해
익숙해지는 시간을 가져보고
기능을 제작하기 위한 기초 지식과
이론에 대해서 알아보도록 하겠습니다
블루프린트 및 블루프린트 스크립팅의 이해
일반적으로 블루프린트 액터의 기능은
코딩을 통해서 제작하게 돼요
프로그래머가 마치 글을 쓰듯이
코딩 문법을 이용해서 제작을 하게 되죠
언리얼 엔진은 코딩에 익숙하지 않은 기획자나 아티스트들도
아주 간단하게 기능을 구현할 수 있도록
비주얼 스크립팅이라는 방식으로 블루프린트의 기능을
제작할 수 있도록 제공해주고 있어요
비주얼 스크립트 방식이 뭐냐면
이 그림에서 보는 것처럼 모드라고 불리는
블럭을 선으로 연결해서
이런 데이터의 흐름을 시각적으로 보면서 작업하는
즉 시각적인 인터페이스로 작업하는 기능을
만들어내는 방식이라고 생각하시면 좋아요
특히 이 언리얼 엔진의 블루프린트의 비주얼 스크립팅 방식은
일반적인 블루 코딩보다도
코딩 관련 기능들을 더 많이 제공하고 있어서
직접적인 코딩 없이도 블루프린트만으로도
어느 정도 규모의 프로젝트를 거뜬히 제작할 수 있을 정도로
굉장히 강력하다고 보시면 좋습니다
먼저 간단하게 블루프린트 사용하는 방법부터
알아보도록 하겠습니다
먼저 일반적으로 프로그래머들이 코딩을 배울 때
Hello World를 출력하는 그런 기능을
만드는 것으로 시작을 해요
우리도 Hello World를 출력하는
기능을 한번 만들어보도록 할게요
저는 베이직 레벨을 열었어요
여기서 간단하게 블루프린트를 배워볼 예정이고요
Content Drawer를 열어서
Content 폴더에 폴더를 하나 만들어 주도록 하겠습니다
이름은 BP라는 이름으로
폴더를 하나 만들어 주도록 할게요
블루프린트의 약자입니다
이 폴더 안에다가 학습을 해볼 거고요
빈 곳에다가 우클릭, 블루프린트 클래스를 선택을 합니다
부모 클래스를 선택하라고 하는 창이 나오게 됩니다
간단하게 이야기하면
언리얼 엔진에서 블루프린트를 만들 때에는
이미 만들어져 있는 특정한 기능을 가지고 와서
그 위에다가 덧붙여서 기능을 만들어라
블루프린트를 만들어라라고 되어 있어요
이런 방식을 기존에 만들었던 것을 그대로 가지고 와서
만드는 방식을 보통 상속한다고 해요
그래서 클래스를 상속해서 새로운 기능을 만들어내는
그런 과정이라고 보시면 돼요
그래서 어떤 것을 상속할 것이냐를 선택한다고 보시면 됩니다
우리는 맨 위에 있는 Actor 클래스를 상속을 받을게요
이 Actor 클래스는 뭐냐면
레벨 공간에다가 배치할 수 있는 기능을 가진
클래스라고 보시면 됩니다
그래서 이 레벨에다가 배치할 예정이니까
Actor 클래스를 선택을 할게요
그러면 상속이 받아져서 블루프린트가 생성이 됐죠
우리는 이름을 BP_Basic이라고 할게요
그러면 Actor 클래스를 상속을 받은
블루프린트 액터가 생성이 됐습니다
더블 클릭해 주시고요
더블 클릭을 하면 이렇게
블루프린트 에디터 창이 나오게 되는데요
저는 이 에디터 창을 레벨 옆에다가 이렇게 정렬을 해뒀어요
전체적으로 보기 위해서요
보시면 가운데 뻥 뚫려 있는 공간이 있고
왼쪽에는 Components와 My Blueprint
그리고 오른쪽에는 Details 창이 있네요
왼쪽의 Components는 언리얼에서 제공하는
기능 블럭을 불러올 수 있는
그런 패널이라고 보시면 되고요
My Blueprint 같은 경우는 우리가 잠시 후에 배울
변수를 담당하는 곳이라고 보시면 되겠습니다
그리고 오른쪽의 Details는 익숙하죠
설정값들을 설정하는
그런 패널이라고 보시면 좋을 것 같아요
뷰포트는 일반적인 뷰포트하고 똑같아요
블루프린트의 어떤 시각적인 표현, 외형을 확인해 보는
그런 공간이라고 보시면 됩니다
우리가 작업할 기능을 만들어줄 작업은
이 상단에 보시면 이렇게 뷰포트 옆에
Event Graph라고 하는 패널을 클릭해 보면
화면이 바뀌는 걸 볼 수가 있어요
여기서 만들 수가 있습니다
기본적인 노드가 세 가지가 있는데
이건 잠시 후에 설명을 하고요
오른쪽에 빈 공간에 우클릭을 하고
우클릭을 하면 검색을 할 수 있는 창이 있고요
이 안에서도 목록이 있죠
여기서도 고를 수가 있는데
우리는 직접 검색을 하도록 하겠습니다
print라고 검색을 해 볼게요
그러면 Print String이라고 하는
노드를 꺼낼 수가 있게 됩니다
클릭을 해 볼게요, 클릭
그러면 Print String이라고 하는 노드를 꺼냈어요
Print String은 어떤 특정한 문구를
출력을 해주는 블럭이라고 생각하시면 좋아요
그래서 안에 있는 이 내용
In String에 있는 네모 박스 안에 있는 내용을
출력하는 기능을 담당하고 있죠
당연히 우리는 Hello World를 할 거니까
여기에다가 Hello World라고 작성을 해야겠죠
여기서 이렇게 끝나는 것이 아니라
이제 이 노드를 어디다가 연결을 하냐면
Event BeginPlay라고 하는 빨간색 노드가 있습니다
처음에 우리가 블루프린트를 만들었을 때
처음 나와 있는 노드예요
이 노드는 이벤트 노드라고 해서
특정한 상황에서 실행하라고 하는 노드라고 보시면 돼요
지금 같은 경우에 BeginPlay죠
BeginPlay는 처음에 시작할 때
처음 플레이를 시작을 할 때
실행하는 이벤트를 발생하는 노드다
라고 생각하시면 좋을 것 같아요
여기에 보시면 화살표처럼 보이는 이런 마크가 보이죠
이것은 실행 핀이라고 하는데
이 실행 핀을 클릭해서 쭉 옆으로 빼면
드래그해서 빼면 이런 식으로 선이 나오게 되고요
이것을 다시 쭉 연결해서
Print String에 있는 이 실행 핀에다가
이렇게 연결을 해주면 선이 이렇게 연결이 됩니다
연결이 잘못되서 취소할 때는
키보드의 Alt 키를 누르고 선을 클릭하면 끊어집니다
선이 사라져요
다시 여기 실행 핀을 드래그&드롭해서
Print String에다가 이렇게 연결을 하겠습니다
그러면 완료가 됐어요
이 노드는 이렇게 잡고 왔다 갔다 할 수 있고요
여기도 마찬가지 잡고 왔다 갔다 할 수 있고요
그 다음에 이렇게 잡고 동시에 왔다 갔다 할 수 있습니다
그리고 마우스 휠 버튼을 이용해서 확대 축소가 가능해요
확대하면 여기까지가 되는데
Ctrl 키를 누르면 더 확대가 됩니다
이런 식으로 할 수가 있고요
그 다음에 마우스 오른쪽 버튼을 눌러서 왔다 갔다 하면
팬 이동이라 그러죠
위치를 이동할 수가 있게 됩니다, 이런 식으로요
그러면 완료가 됐어요
여기서 완료가 되면
왼쪽 상단에 Compile이라고 하는
물음표 표시가 되어 있는 이 버튼을 눌러줘야 돼요
Compile이 뭐냐면
사람이 알아들을 수 있는 이런 언어들을
컴퓨터라는 기계가 알아들을 수 있는 언어로
변환시켜주는 작업이라고 생각하시면 좋습니다
그래서 반드시 이런 작업들을 우리가 진행을 하게 되면
이 Compile이라는 버튼을 반드시 눌러줘야 돼요
그리고 어떤 우리가 작업을 하게 되면
상단에 보시면 이렇게 이름 옆에
* 표시가 떠 있는 걸 볼 수가 있어요
그리고 애셋에서도 보시면
어떤 작업을 하고 나면
이렇게 가운데에 * 표시가 있는 걸 볼 수가 있습니다
이렇게 * 표시가 되어 있다라는 건 뭐냐면
작업은 했되 저장하지 않았다라는 것을 표현합니다
마치 우리가 이제 워드나
혹은 PPT 문서에서 작업을 할 때
글을 쓰고 나서 저장을 하지 않은 상태라고 보시면 돼요
블루프린트 같은 경우에는 Compile을 하고 나서
반드시 저장까지 해줘야
안정적으로 작동하는 걸 볼 수가 있을 거예요
그래서 반드시 Compile을 하고
저장 버튼을 눌러주는
이런 습관을 기르는 걸 추천드리겠습니다
그래서 저도 Compile 버튼 눌렀고요
그 다음에 저장 버튼을 누르도록 하겠습니다
그럼 이제 * 표시 사라졌죠
Content Drawer 상에서도 * 표시가 사라진 걸 볼 수가 있어요
우리는 간단하게 Hello World라는 기능을 만들었으니까
제대로 작동하는지 한번 알아보도록 하겠습니다
Untitled라고 하는 지금 이름이 아직 적용되지 않았네요
레벨로 돌아오도록 하겠습니다
레벨로 돌아와서 우리가 만든 Content Drawer를 열어서
우리가 만든 이 블루프린트를 배치를 시켜야 돼요
그래서 드래그&드롭으로 이렇게 배치를 시키도록 하겠습니다
저는 항상 모든 애셋들은 레벨에 배치하면
저는 원점에 두는 습관을 가지고 있어요
그래서 원점에 두고
이 상태에서 플레이를 해보도록 하겠습니다
상단에 플레이 버튼을 누르면
이 뷰포트 화면 상단에 Hello World가 잠깐 나왔다
사라진 걸 볼 수가 있었을 겁니다
너무 금방 사라져서 좀 수정을 해보도록 할게요
이 Print String의 아래쪽의 화살표를 누르면
Print String 기능을 설정할 수 있는 항목들이 뜨는데
여기 Duration이라고 하는 게 지금 2라고 되어 있어요
2초 동안 보여주고 사라진다는 의미거든요
이걸 조금 더 늘려보도록 하겠습니다
10초만 보여지고 사라지도록 이렇게 설정을 할게요
우리 수정을 했으니까 Compile을 하고
왼쪽 위쪽에 Compile을 하고, Compile을 했으면
저장까지 하는 습관까지, 됐죠?
다시 레벨로 돌아와서
다시 한번 플레이를 눌러보도록 하겠습니다
이렇게 플레이를 해보니까 어때요?
왼쪽 상단에 이런 식으로 Hello World라고 하는
하늘색 문구가 출력되는 걸 볼 수가 있습니다
10초가 지나니까 사라지는 것도 확인해 볼 수가 있죠
자 됐습니다
우리는 블루프린트를 통해서 기능을 만든 거예요
우리가 만들었던 블루프린트의 노드에 대해서
좀 더 알아보도록 할게요
간단하게 자주 쓰는 노드를 하나 꺼냈는데요
이 노드는 Set Actor Rotation이라고 하는
액터의 회전을 설정할 수 있는 그런 노드예요
그래서 상단에 보시면 이 노드의 이름이 적혀 있고요
이 노드가 이 이름에서 이 데이터가 무슨 기능을 하는지
대충은 알 수 있게끔 그렇게 나오겠죠
그리고 위에 있는 하얀색 핀이 있었습니다
이 핀은 실행 핀이라고 이야기 했었죠
앞서서 실행해라는 명령을 받으면
이 노드를 통해서 이 기능이 작동을 하게 되죠
그리고 작동이 끝나면 이 뒤에 있는 실행 핀을 통해서
뒤쪽으로 다음 일을 하라고 실행하게 되는
그렇게 실행의 명령을 받고 실행하라고 하는 명령을 하는
그 실행의 흐름을 보여주는 연결해주는
그런 핀이라고 생각하시면 좋습니다
그리고 아래쪽에도 이런 핀들이 있어요
이런 핀들을 모두 다 데이터 핀이라고 이야기 하는데요
왼쪽에 있는 것은 입력 핀이에요
그래서 이 노드에서 기능을 실행을 할 때
어떠한 데이터를 입력 받을지를
이 왼쪽의 핀을 통해서 입력 받게 됩니다
그리고 이 노드를 통해서 완료된, 계산된 그런 데이터들은
오른쪽에 있는 이 핀을 통해서 뽑아져 나가게 되는 것이죠
그래서 이 블루프린트의 흐름은
왼쪽에서 오른쪽으로 이 데이터의 흐름이 이어지게 돼요
그래서 보시면 아시겠지만
우리는 왼쪽에서부터 시작해서 오른쪽으로
Event BeginPlay라고 하는 이 노드는
처음 시작할 때 이벤트가 발생하는 것이라고 했었죠
이벤트가 발생하면 다음 Print String을 실행하라고
우리는 연결을 해준 거예요
하지만 이 Print String에서는 데이터는 받지 않았어요
왼쪽 핀은 있어도 데이터는 받지 않았지만
Hello World라고 하는 이 자체적인 데이터를
우리가 입력을 해서 실행하게 했죠
이 프린트 같은 경우에는
데이터가 다음 노드로 빠질 일이 없기 때문에
이런 아웃 핀
밖으로 나가는 출력 핀이 없을 수도 있게 되는 거죠
대신에 다음에 어떤 일을 하게 되라
어떤 다른 기능을 하라고 하면
이런 식으로 실행 핀이 연결돼서
다음 기능을 할 수 있도록 이렇게 할 수 있겠죠
이렇게 연결을 했다면 Print String을 하고
그 다음에 Set Actor Rotation이 작동한다
이렇게 생각하시면 좋을 것 같습니다
데이터 타입 종류 및 블루프린트 사칙 연산
그러면 이 핀에다가 데이터를 한번 입력을 해 볼게요
변수라고 하는 데이터를 만들어서 입력을 해 볼 건데요
변수라고 하는 건 뭐냐면
일반적인 그릇이라고 생각하시면 좋아요
우리가 밥을 먹기 위해서 밥그릇에 밥을 담아 먹죠?
그리고 흙을 담을 때는
화분이라고 하는 그릇에 흙을 담아요
우리는 화분에다가 밥을 담아 먹지는 않을 거예요
그렇죠?
프로그래밍에서도 입력값이라든지
결과값 같은 그런 수많은 데이터들을 처리하고 있고요
그 각각의 데이터들은
저마다 담아놓을 수 있는 그릇에 담겨 있어요
바로 이 그릇을 변수라고 이야기를 합니다
일반적인 그릇이 그렇듯이 변수도
모든 데이터를 다 저장할 수 있는 것이 아니에요
변수를 만들 때마다 담을 수 있는
데이터의 종류를 결정해주는데
이러한 용도 지정을 일컬어서 자료형
즉 데이터 타입이라고 불러요
그렇다면 과연 이 자료형은 몇 개나 있을까요?
이 자료형은 프로그래밍 언어를 만들 때
사전에 미리 정해놓은 기본 자료형과
그리고 개발자가 개발 상황에 따라서 만든
클래스를 담기 위해서 만든
사용자 정의 자료형 두 가지 형태가 있어요
클래스 자료형, 사용자 정의 자료형 같은 경우에는
개발자의 개발 상황에 따라 생산되는 것이기 때문에
수량의 제한이 없어요
그래서 논외로 하고요
이런 기본 자료형만 따져봐도
전부 합하면 수십가지나 되기 때문에
사실상 모두 다 외울 수는 없어요
그래서 우리는 가장 빈번하게 사용하는
네 가지 자료형을 기반으로
변수 노드를 한번 만들어 보는 실습을 해 보도록 하고요
그 외에도 자주 쓰는 노드에 대해서
우리가 이번에 만들 기능에 관련된
노드들도 알아보도록 할게요
그럼 다시 돌아와서 이 Print String에다가
변수를 하나 만들어서
그 변수 값을 출력하도록 그렇게 한번 해 보도록 할게요
변수를 만드는 방법은 왼쪽 아래에 있습니다
왼쪽 아래에 My Blueprint라고 하는 패널이 있어요
이 중에 보시면 VARIABLES라고 하는 항목이 있죠
VARIABLES에 + 버튼을 누르면
이런 식으로 변수가 만들어져요
여기 이름을 한번 만들어 볼게요
이름은 Number1이라고 한번 만들어볼게요
이름을 만들었죠
이건 그릇의 이름이고요
이 그릇이 어떠한 용도로 쓰일 것인지는
이 오른쪽에 빨간색 Boolean이라고 되어 있는 이 항목을
선택해 보면 알 수가 있어요
클릭하면 이렇게 여러가지 항목들이 나오죠
이 항목들이 전부 다 자료형 혹은 데이터 타입의 종류들이에요
되게 많죠? 이 중에서 우리는 네 가지만 해 볼게요
첫번째 Integer를 한번 선택을 해 볼게요
클릭, 그럼 이렇게 Integer로 바뀌어 있죠
Number1이라고 하는 그릇은 Integer라고 하는 데이터를
담는 그릇이야라고 설정을 해 준 거예요
Integer는 뭐냐면
Integer는 일반적인 정수를 의미합니다
Integer는 정수를 의미하고요
이 변수를 선택한 상태에서 Details 창으로 가면
이렇게 Details 창에서 여러가지 설정들을 할 수 있고요
저기 아래쪽에 보면 Default Value라고 하는 항목에서
값을 지정해서 넣을 수가 있어요
지금은 넣을 수가 없죠 Compile을 하라고 하네요
그러면 Compile을 먼저 해 주도록 할게요
Compile을 하고, Compile하면 저장을 하라고 했죠
그러고 나서 보면 이렇게
Number1이라고 하는 변수 이름과 함께
0이라는 숫자가 들어가는 걸 볼 수가 있습니다
여기에 우리가 원하는 숫자를 넣으면 돼요
100이라는 숫자를 한번 넣어 보도록 할게요
Integer니까, 정수를 담는 변수니까
100이라는 숫자 입력이 되죠
만약에 여기다 소수점을 한번 넣어볼게요
소수점은 정수가 아니죠
만약에 100.1이다라고 하면
뒤에 있는 .1은 탈락되게 됩니다
이 상태에서 다시 수정이 됐으니까 Compile, 저장하고
이 변수를 Print String에다가 연결을 해 보도록 할게요
변수를 잡고 이 빈 공간에다가
드래그&드롭을 해 볼게요
드래그&드롭 하면 두 가지 선택지가 나와요
Get Number1은 이 변수를 가지고 올 것이다
Set Number1은 이 변수에 특정한 값을 입력할 것이다
우리는 이 변수의 값을 가져오는 것이니까
Get Number1을 선택하면 되겠죠
그럼 이렇게 캡슐 모양의 노드가 생성이 됩니다
이 캡슐 모양은 데이터 노드 라고 생각하시면 돼요
여기에는 어떤 값들이 담겨 있어요
데이터가 담겨 있으니까 데이터 핀 하나밖에 없죠
그래서 이 데이터 핀을
Print String에다가 연결을 시켜 주도록 할게요
데이터 핀을 빼서 스트링에다가 이렇게 연결을 하겠습니다
연결을 하면 이렇게 중간에 우리가 원하지 않은
노드 하나가 생성되는 걸 볼 수가 있어요
이걸 변환 노드라고 하는데 우리가 만든 변수는 Integer
즉 정수만을 담은 변수에요, 즉 정수 데이터인거죠
하지만 Print String 노드에는
In String이라고 되어 있어요
즉 스트링 변수, 스트링 데이터 타입만
꽂아 넣게끔 되어 있는 것이죠
그래서 서로 데이터가 맞지 않기 때문에
이 데이터를 서로에 맞게끔
변환시켜주는 작업을 해줘야 돼요
그 역할을 하는 게 바로 이 변환 노드고요
언리얼 엔진 같은 경우는
이 변환 노드를 자동적으로 만들어줘서
편리하게 작업할 수 있도록 도와주고 있죠
바로 한번 확인해 볼까요
Compile, 저장하고
다시 레벨에 들어가서 플레이 버튼을 누르면
좌측 상단에 이렇게 100이라는 숫자가
출력이 되는 걸 볼 수가 있습니다
또 다른 변수를 한번 또 만들어 보도록 하죠
이번에는 VARIABLES의 + 버튼을 눌러서
Number2라고 하는 자료형 그릇을 만들고요
이번에는 Integer가 아니라 Float이라는 자료형을
선택을 해 보도록 할게요
Float은 실수를 의미합니다, 실수
실수는 소수점을 포함한 숫자를 의미하죠
당연히 정수 1, 2, 3, 4도 포함되지만
소수점, .5, .14
뭐 이런 소수점 이하의 숫자도 포함되는
정수보다는 조금 더 큰 범위의 숫자라고 하시면
좋을 것 같아요
그래서 Compile, 저장을 하고요
이 Number2 변수를 가져오도록 할게요
드래그&드롭, Get Number2
이 스트링에다가 연결해 볼게요
드래그&드롭으로 이렇게 연결해 보도록 하겠습니다
역시 마찬가지로 자료형이
이 데이터 타입이 다르기 때문에
변환 노드가 자동적으로 생성된 걸 볼 수가 있죠
아 숫자를 입력 안 했군요
숫자는, 기본 숫자는, 이 변수의 기본 값은
보시면 이렇게 0.0으로
소수점도 포함될 수 있어라는 걸 보여주고 있죠
한번 이렇게 써볼게요
3.14라고 이렇게 한번 써볼게요
이 상태에서 Compile, 저장하고
다시 돌아와서 플레이를 해 보면
이렇게 3.14가 출력되는 것을 볼 수가 있습니다
이런 기능들을 추가할 때는 반드시 이 플레이가
정지되어 있는 상태여야 합니다
그래야 제대로 된 기능을 작성할 수가 있어요
변수 하나를 더 만들어 볼게요
+ 버튼을 눌러서 이번에는
Text1이라고 하는 이름의 변수를 하나 만들게요
이름에서도 알 수 있듯이 이번에는 글자를 담을 거예요
글자는 우리 Print String에서 잠깐 언급을 했지만
이 String이라는 자료형을 통해서 글자, 문자를 담습니다
드래그&드롭 해서 Get Text1이라고 하는
변수를 꺼내고 연결을 해 볼게요
이렇게 연결을 하면 같은 스트링이기 때문에
중간에 변화 노드가 없죠
바로 연결되는 걸 볼 수가 있을 거에요
그런데 이 연결되어 있는 선이
이 변환 노드들을 가로질러 좀 지저분하죠
그래서 이 선을 정리 좀 해 볼게요
옆으로 살짝 빼서 이 선 사이에 마우스를 올려 놓고
더블 클릭을 하면, 따닥 클릭을 하면
새로운 점이 하나 생깁니다
새로운 핀이 하나 생기게 되고요
이 핀을 잡고 이동할 수가 있어요
이렇게 옮기게 되면 복잡하지 않게 정리할 수 있게 돼요
이 Text에 아직 우리가 값을 정하지 않았네요
그래서 Compile, 저장하고
언리얼 엔진이라고 할까요? 언리얼 엔진
이 문자열은 한글도 입력이 가능합니다
이 상태에서 Compile을 하고
다시 저장을 하고요
다시 플레이를 하면 이런 식으로
언리얼 엔진이라는 문구가
출력이 되는 걸 알 수가 있습니다
이번에는 참과 거짓을 판별하는 논리 자료형이 있어요
사람입니까? 사람이 아닙니까? 이런 것들
플레이 중입니까? 플레이가 아닙니까? 라고 하는
참과 거짓을, 기다 아니다를 알려주는
그런 정보값을 담는 그런 변수가 있어요
논리 자료형인데
그래서 이름을 is, 사람입니까? man이라고 할게요
이 논리 자료형은 뭐냐면 위에 있는 Boolean입니다
우리 맨 처음에 변수 만들 때 Boolean을 잠깐 봤었죠
이 Boolean이 바로 아까 얘기했던
참과 거짓을 담는 변수에요
그래서 이 내용하고는 상관이 없이
이게 뭐 사람이냐 사람이 아니냐
플레이 중이냐 플레이 중이 아니냐
뭐 이런 것과는 상관이 없이
맞다 아니다의 정보만 이 안에다가 담는 거예요
Compile을 해서 분류값을 보면
Is Man이라고 하는 변수 이름이 있고요
오른쪽에 보면 체크 박스가 이렇게 있는 걸 볼 수가 있습니다
그래서 비활성화되어 있다면 False, 거짓을 의미하고요
체크가 되어 있다면 True, 참을 저장을 한 거예요
이 변수에다가
그래서 지금 체크를 했으니까
True, 참 값이 변수에 저장이 된 거죠
이렇게 해놓고 이 변수를 가지고 와서
연결을 해 보도록 할게요
Bool값이니까 이런 식으로 변환 노드가 나오게 되고요
이 상태에서 Compile, 저장하고 플레이를 해 보면
이런 식으로 True 값이 출력이 되는 걸 볼 수가 있습니다
아까 우리가 체크를 했었죠
체크는 곧 True, 참이다라고 얘기를 했었어요
반면에 이 변수의 값을
체크를 취소해서 False로 만들어 준다면
Compile, 저장, 플레이를 해 보면
이런 식으로 False라고 하는 값이 출력이 됩니다
네 가지 변수에 대해서 알아 봤는데요
이 네 가지 변수만 알아도 우리는
많은 작업들을 할 수가 있게 됩니다
이번에는 변수 말고, 이 변수를 활용해서
어떤 기능들을 만들 수 있는
어떤 제어문들에 대해서 알아보도록 할 거예요
제어를 한다는 것은 이 변수들을 가지고
지지고 볶고 한다는 얘기죠
그래서 일단 가장 간단한
사칙 연산부터 좀 해 보도록 할게요
이 변수들은 소개를 위해서 만들었으니까
새롭게 변수를 만들면서 시작을 해 보도록 하겠습니다
일단 + 버튼을 누르고
이번에는, Number를 먼저 썼군요
Num이라고 하는, 숫자 01로 이름을 새로 만들고
이것은 자료형을 Integer
정수가 조금 개선하기 편하니까
Integer로 만들어 보도록 하겠습니다
Compile을 하고 이 숫자에는
100이라는 숫자를 입력을 할게요
그리고 변수 하나를 더 만들게요
VARIABLES 클릭, 이름은 Num02라고 할게요
역시 마찬가지 Integer로 하도록 하겠습니다
역시 마찬가지로 Compile 버튼을 누르고
이 변수에는 50이라는 숫자를 한번 담아보도록 할게요
사칙 연산 중에 더하기를 하게 되면 150이 되겠죠
이런 식으로 편하게 하기 위해서
그러면 여기에 있는 이 두 변수를 가지고 와 볼게요
드래그&드롭해서 Get Number1, Get Number2를
가져오도록 하겠습니다
이 두 숫자를 더해 볼게요
어떻게 더하냐면 빈 곳에 우클릭을 해서
add라고 검색을 하게 되면
Operators 라고 하는 것 중에
Add라고 하는 노드가 있어요
Add를 선택을 하면 이런 노드가 있죠
이 노드는 이 왼쪽에 있는 입력 핀을 더해서
더한 결과 값을 내보내주는
그런 노드라고 생각하시면 좋아요
그래서 왼쪽 위에 Num01, Num02
아래쪽에 Num02를 이렇게 입력하면 되겠죠
그리고 이 결과물을 다시
Print String에 이렇게 연결을 하면
이렇게 변환을 통해서
Print String에 연결되는 걸 볼 수가 있어요
Compile을 하고 확인해 볼까요
더하기를 했으니까, 100+50이니까
150이 출력이 될 거예요
봅시다, 플레이를 해 봅시다
어때요? 150이 출력이 되죠
우리는 더하기를 해 본 거예요, 간단하죠?
이 외에도 더하기 노드는
더하기를 하면 더하기가 되는 거고요
똑같아요
마이너스, 영어로는 subtract죠
subtract라고 검색을 하면 이런 식으로
마이너스 노드 사용법은 똑같습니다
마이너스 노드도 연결해서 출력이 가능하고
곱하기도 마찬가지예요
multiply라고 검색을 하면 이런 식으로
Multiply, 곱하기 노드도 꺼내서 사용할 수 있게 됩니다
방법은 역시 똑같아요
나누기도 마찬가지겠죠
우클릭해서 divide라고 검색을 하면
이런 식으로 나누기 노드가 생성이 되고
똑같은 방식으로 두 변수를 나눈 결과 값을 연결해서
최종 결과물을 볼 수가 있게 됩니다
여기서 이제 중요한 것은 더하기 노드를 만들어서
결과물을 보고 싶은데
지금 같은 경우에 들어와서 이 변수에다가
지금 102번에는 50이라는 변수의 숫자를 넣었는데
Compile하고 저장하고
플레이를 해보고 하는 과정들이 조금은 복잡하죠
그냥 이 레벨 안에서 바로 설정을 하고
바로 결과값을 봤으면 좋겠는데
보려면 또 블루프린트 안으로 들어가서
설정해주고 Compile해주고 왔다갔다하기가
여간 번거로운 게 아닐 겁니다
그래서 이 노드를 이 외부에다가 노출시키는
그런 기능을 제공하고 있어요
보시면
우리는 더하기에 지금
Num01과 Num02 변수를 사용하고 있죠
오른쪽에 보시면 여기 눈을 감은 표시가 있죠
이 아이콘을 클릭을 하면 이렇게
눈을 뜬 표시로 바뀌게 됩니다
이렇게 되면 어떻게 되냐면
Compile해서 저장해서 보시면
우리가 올려놓아 있는
BP_Basic이라고 하는 이 액터를 선택해서
이 Details 창을 보시면 이렇게
Default라고 하는 항목에
Num01이라고 하는 변수가
노출되어 있는 걸 볼 수가 있어요
값도 100 이라는 숫자가 들어가 있는 걸
확인해 볼 수가 있죠
간단하죠? 그럼 두 번째도 한번 노출시켜 볼게요
이 버튼을 클릭, 혹은 이 버튼은 Details 창에 보시면
이 변수를 선택하고 나서
이 블루프린트 창의 Details 창을 보시면
Instance Editable이라고 하는 항목이 있을 겁니다
여기가 체크된 걸 볼 수가 있어요
눈을 감으면 체크가 풀린 걸 볼 수 있죠
반대로 여기를 체크를 하면
이렇게 눈이 켜져 있는 걸 볼 수가 있을 겁니다
여기에 있는 이 항목이 외부에 노출시켜 줄 수 있는
그런 항목이라고 보시면 돼요
그래서 Compile하고 저장해서 보시면
이제 우리가 올려놓은 이 액터를 선택하면
이 Details 창에 이렇게 두 가지 변수의 값이
노출된 걸 볼 수가 있습니다
한번 바꿔볼까요?
얘를 300 이라고 한번 해볼게요
그럼 얼마가 될까요
지금 더하기 노드가 되어 있으니까 400이 되겠네요
플레이를 해보면 이렇게 400이라는 숫자가
출력이 되는 걸 볼 수가 있죠
간편하죠
변수를 이용해서 사칙 연산을 해봤죠
이번에는 조건문에 대해서 알아보도록 할게요
조건문은 만일 ~~하면 ~~한다라는 구조로
대부분의 프로그래밍은 사칙 연산들처럼
무조건 실행하는 경우보다는
특정한 조건이 충족이 될 때만
실행하는 경우가 훨씬 많아요
예를 들면 그냥 문이 열렸다가 아니라
버튼을 눌렀을 때 문이 열렸다
혹은 무조건 적을 이렇게 생성하는 것이 아니라
2초가 되면 적이 생성되라
뭐 이런 경우죠
그래서 간단하게 조건문 예제를 한번 만들어서
그거대로 한번 만들어 보도록 할게요
우리는 어떻게 할 거냐면
Num01이라는 변수와 Num02라는 변수를 비교해서
만일 Num01이라고 하는 숫자가
Num02보다 훨씬 더 크다면
Num01이 더 큽니다라는 메시지를 출력을 하고요
그렇지 않고 Num02가 크다면
비교해서 Num02가 더 크다면
즉 Num01이 Num02보다 크지 않다면
2번이 더 큽니다를 출력하도록
이런 조건을 한번 붙여 보도록 할 거예요
그러기 위해서는 일단은
앞에 있는 더하기는 지우도록 하고요
이 두 변수를 비교해서
그 결과물에 따라서 다른 것을 출력하도록 하는 거니까
어쨌거나 비교를 해야겠죠
이 두 변수를 비교해야 됩니다
그래서 두 변수를 비교하는 노드를 꺼내줄게요
우클릭해서, 우리는 아마 수학시간에서 배웠을 거예요
비교하는 것, 무엇무엇보다 크다
혹은 무엇보다 작다, 꺽쇠로 표현하죠
키보드에 꺽쇠를 이렇게 누르면 이런 식으로
Greater라고 하는 노드를 꺼낼 수가 있게 됩니다
이렇게요
그래서 위에 있는 핀에 Num01을 이렇게 넣고
아래쪽에다가 밑에 있는 변수를 이렇게 넣으면
Num01이 Num02보다 큽니까라는
그런 노드가 만들어진 거예요
이것을 비교 연산자라고 이야기합니다
그래서 크다도 있겠지만
우리 수학시간에 배우는 것처럼 작다도 있고요
Less가 있죠
이렇게 작다도 있고
그 다음에 크거나 같다 이런 것도 있었죠
크거나 같다, Greater, Equal 이런 것도 있죠
작거나 같다도 있겠죠
그리고 이런 것도 있을 거에요
같다도 있을 거에요
같다는 우리는 일반적으로 = 이렇게 표현을 하지만
일반적으로 코딩에서는 =은 대입 연산자라고 해서
값을 집어넣는 것으로 사용합니다
그래서 코딩은 같다라는 걸 표현하기에는
==이라는 것으로 표현합니다
그래서 Equal이라는 노드가 이렇게 나와요
==이 나와요, ==
같다라는 것이 있다면 같지 않다라는 것도 있겠죠
코드에서는 앞에 느낌표를 붙여요
!= 이라고 쓰면
이게 not Equal, 같지 않다를 의미하게 됩니다
이렇게 서로 두 정보를 비교할 수 있어요
우리가 원하는 것은 이 앞에 있는 변수
Num01 변수가 Num02 변수보다 크니?라는 걸 원하니까
Greater 노드를 이용했어요
이제 변수 두 개를 비교를 했죠
그럼 이제 해야 될 것은 뭐냐면
이 두 변수의 결과 값에 따라서
Num01 변수가 크면 Num01이 크다를 출력하고
Num02가 크다면 Num02가 크다라는
문구를 출력해야 되는
그런 작업을 해야 돼요
그래서 이 비교 연산자를 통해서 나온
이 결과 값을 통해서
두 분기로 나눠지기 때문에
또 하나의 노드가 필요하게 됩니다
이때 필요한 노드가 뭐냐면
Branch라고 하는 노드가 있어요
그래서 Branch 노드를 꺼내고
이 Branch 노드를 BeginPlay에서 실행해서
바로 Branch에다가 연결을 해주는 거예요
먼저 검사해, 무엇을?
Num01과 Num02를 비교한 결과 값을 이렇게 검사해
라고 해서 결과값을 이렇게 컨디션에다가 연결을 해줍니다
그랬을 때 이 결과 값이 참이라면
참이라는 얘기는 뭐냐면
Num01이 Num02보다 크다
어 맞아, 참이야
Num01이 커 라고 하면 True로 가는 거고요
Num01이 크지 않아라고 했으면 False, 거짓이구나
False로 가게 되는
그런 분기를 타게 되는 거라고 보시면 돼요
그러면 이렇게 하면 되죠
만약에 True, 맞아
Num01과 Num02가 비교했을 때
Num01이 더 큰게 맞아라고 하면
이 True를 Print String으로 연결을 하는 겁니다
이때 무엇을 출력하냐면
Num01이 크다라는 걸 출력하는 거죠
스펠링이 틀렸네요
그리고 두 노드를 비교해서
1보다 2가 더 크니? 아니, 2가 더 커라고 했을 때
False가 나와야 되겠죠
이 False 때는 Num02가 더 크다라는 걸
출력을 하는 거니까
이 노드를 그대로 복사해서
Ctrl+C, Ctrl+V를 해서
두 번째 노드에 연결을 해주고
여기는 아니, Num02가 더 커
이런 식으로 연결을 해줍니다
이게 조건문이에요
Branch를 이용해서
앞에 있는 조건식에 있는 결과에 따라서
그 결과의 값이 참이라면 True 실행 핀으로 연결해서
이쪽을 실행하게 되고
만약에 이 결과의 값이 거짓이라면
이 밑에 있는 False의 실행 핀을 이용해서
이 아래쪽에 있는 것은 실행하라 이렇게 되는 거죠
Compile하고 저장하고
지금 같은 경우에 보세요
Num01에 100, Num02는 300이라는 숫자가 있으니까
1하고 2하고 비교했을 때
Num01이 Num02보다 크니?라고 물어봤는데
지금 보면 아니죠
거짓이죠?
그러면 거짓 라인을 탈 거예요
거짓 실행 핀을 탈 거니까
아니, Num02가 더 커
라는 게 아마 출력이 될 거예요
봅시다, 플레이를 해 볼게요
어때요? Num02가 더 크다라고 나오죠
이번엔 반대로 해 볼게요
100이 아니라 500으로 가 볼게요
Num01이 더 크죠?
Num02보다 Num01이 더 크니까
이번에는 참이 나올 거예요
플레이를 해 볼게요
그러면 이렇게 Num01이 더 크다라고 나오네요
어떠한 계산 결과가 그 값이 참이냐 거짓이냐에 따라서
분기로 나누어지는 이런 구조, 조건문이었습니다
그러면 사칙 연산도 알아봤고
조건문에 대해서도 알아봤고요
이벤트 그래프 실행 순서
노드에 대해서도 알아봤는데
이번에는 마지막으로 빨간색 노드에 대해서 알아보려고 해요
이 빨간색 노드, 이벤트 노드라고 했었죠
이벤트 노드는 아마 여러분들이 처음
블루프린트 이벤트 그래프를 열었을 때
이 3개의 노드가 만들어졌던 것을 기억하실 거예요
이 노드는 전부 다 이벤트 노드라고 부르고요
일반적인 노드는 왼쪽에서 실행 핀에 의해서
이렇게 왼쪽에서 실행 핀에 의해서 호출돼서
실행할 순서가 되면 오른쪽으로 이렇게
실행되는 것에 반해서
이런 이벤트 노드들은 왼쪽에 실행 핀이 없고
언리얼 엔진 시스템에 의해서 자동적으로 실행이 돼요
그럼 언제 이런 이벤트가 발생을 하게 되는 걸까요
여기에는 이 사람과 연결을 좀 지으면
이해하기가 좀 쉬울 거예요
무슨 얘기냐
사람은 태어나서 살다가 죽습니다
보통 이런 사람의 생애에 대한 일련의 과정을
생애 주기, Life Cycle이라고 불러요
프로그래밍 엔진에서도 객체를 생성하면
생성된 객체마다 이런 생애 주기, Life Cycle에 따라서
특정 이벤트를 호출을 합니다
그래서 객체가 최초로 생성되었을 때
사람으로 치면 처음 태어났을 때죠
딱 한 번, 한 번 호출되는 노드가 바로
Event BeginPlay 노드예요
그래서 최초 한 번 호출이 되죠
그리고 반면에 객체가 파괴되지 않고 유지되는 동안
사람으로 치면 태어난 이후에
계속 살아가는 내내가 되겠죠
이렇게 파괴되지 않고 유지되는 동안
살아있는 동안 한 프레임마다 반복해서 호출되는
이 Event Tick 노드가 있어요
매 프레임마다 전체적인 코드를 다 계산하고
매 프레임마다 계속 새로 갱신된 이미지를
계속 보여주게 될 거예요
그래서 우리는, 사용자는 움직임을 인지하게 되는 겁니다
보통 움직인다고 얘기하는 것은
Event Tick 호출을 통해서
발현된다고 생각하시면 좋아요
그리고 사람으로 치면 사망에 해당하는
이런 객체가 파괴되기 직전에 호출되는 이런 노드는
Event Destroyed라고 하는 노드가 있습니다
이렇게 우리가 실습할 때는
한 번만 실행하도록 하기 위해서
이렇게 Event BeginPlay 노드에
이런 실행 핀을, 다음 실행 핀을 연결을 했어요
만약에 처음 호출되는 이런 BeginPlay가 아니라
Event Tick, 저기 아래 있죠
여기 Event Tick에다가 연결이 되면 어떨까요
한번 가까이 볼까요
이거는 잠시 끊고요
잠시 끊고 이벤트 노드에다가
Event BeginPlay는
호출 되었습니다
라고 하는 이 문구를 연결시켜 볼게요
아마 처음에 우리는 Hello World라는 문구를
한번 실행해 본 걸 기억할 거예요
BeginPlay를 하면 한 번만 호출이 되겠죠
Compile하고 저장하고 플레이를 해보면
이렇게 한번 호출 되었습니다라고
한번 호출이 되는 걸 볼 수가 있습니다
이것을 Event Tick에다가 한번 연결해 볼게요
어떤 일이 벌어지냐
Compile하고 저장하고 플레이를 해보면
왼쪽에 호출 되었습니다가
계속 출력이 되는 걸 볼 수 있어요
여기서 계속 누적이 되고 있는 거예요
가장 위에 있는 호출 되었습니다가
가장 마지막에 계산되었다고 보시면 될 거예요
여기서부터 여기까지 지금 보시면
지금 이렇게 읽고 있군요
계속 이렇게 읽고 있는 걸 볼 수가 있죠
한번 읽었으면 다시 또 돌아와서 또 한번 읽고
또 한번 읽고 또 한번 읽고를 계속 하고 있다라는 것이
이게 바로 Event Tick이라고 합니다
그리고 보시면 이렇게 이벤트
여기서 멈추고요
Event ActorBeginOverlap이라고
이야기하는 게 있는데
이거는 충돌에 관련된 얘기에요
Begin과 Tick 그 다음에 충돌에 관련된 이벤트는
객체가 쭉 살아가기 때문에 기본적으로 있는 거예요
언제든 충돌할 수도 있고
살다보면 어떻게 부딪힐 수도 있고 하잖아요
그래서 이 세 가지 이벤트 노드는
항상 이렇게 먼저 나오게 됩니다
하지만 보시면 알겠지만 Destroyed는 없어요
왜냐하면 이 객체가 언제 사라질지 모르기 때문에
부딪혀서 사라질 수도 있지만
사라지지 않을 수도 있고요
혹은 평생 사라지지 않을 수도 있기 때문에
이 Destroyed 같은 경우는
개발자가 원할 때 꺼내라고 되어 있어서
기본적으로는 먼저 나와 있지는 않아요
그래서 이렇게 세 가지가 나오게 되는 겁니다
이제 아시겠죠?
그럼 이제 블루프린트의 기초적인 이론은
어느 정도는 다 다뤄본 것 같아요
이 정도 기본 이론을 가지고 있으면
웬만한 기능들은 만들어볼 수 있으니까
다음 영상에서 간단한 기능들을
이 이론을 토대로 해서 만들어보도록 할 거예요
그럼 이번 시간에 학습한 내용을 정리해 보겠습니다
블루프린트 및 블루프린트 스크립팅의 이해 블루프린트 복잡한 액터를 설계하도록 고안된 언리얼 고유의 설계 시스템 비주얼 스크립팅 시스템
블루프린트 스크립팅 Content 폴더에 새 폴더 생성 후 BP로 저장 BP 폴더의 빈 공간에 마우스 우클릭 후 Blueprint Class 선택
Actor 클래스 선택 후 BP_Basic으로 블루프린트 클래스 이름 설정 Event Graph 패널로 이동 후 빈 공간에 마우스 우클릭해 Print String 노드 생성
Print String 노드에 Hello World 입력 후 Event BeginPlay 노드 실행 핀과 연결 BP_Basic 블루프린트 클래스를 드래그해 월드에 배치
실행 시 뷰포트 좌측 상단에 'Hello World' 문구 제시되는 것 확인 노드의 구조 및 흐름
블루프린트 노드 구성: 실행 핀(Excute Pin), 입력 핀(Input Pin), 출력 핀(Output Pin) 데이터 흐름은 좌에서 우로 실행
데이터 타입 종류 및 블루프린트 사칙 연산 변수 각각의 데이터를 담아 놓을 수 있는 그릇 자료형(Data Type): 변수가 가질 수 있는 데이터의 종류
기본 자료형: 프로그래밍 언어 제작 시 정해놓은 자료형 사용자 정의 자료형: 개발 상황에 따라 제작되는 자료형
가장 많이 사용하는 기본 자료형: Float(실수), Integer(정수), String(문자열), Boolean(논리형)
변수 입력하기 Variables 항목 [+] 버튼을 이용해 정수형 변수 Number1 선언하고 컴파일/저장 Number1 변수에 100 값 넣기
Number1을 Event Graph에 Get Number1 변수를 드래그 앤 드롭 Number1의 출력 핀을 Print String의 In String 입력 핀에 연결
컴파일/저장 후 실행해 좌측 상단에 '100'이 출력되는 것 확인
블루프린트 사칙 연산 Variables 항목 [+] 버튼을 이용해 integer 자료형 Num01, Num02 변수 선언 Add 노드 추가
입력 핀에 정수형 변수 Num01, Num02 추가 후 출력 핀을 In String 핀에 연결 빼기(Subtract), 곱하기(Multiply), 나누기(Divide)도 같은 방식
조건문 '만일 ~하면 ~한다.'의 구조 (영어의 'if')
Branch 노드 - 조건식의 결과에 따라 True/False로 실행의 흐름이 나뉘게 됨 두 값을 비교해서 어느 쪽이 큰지 출력하기
이벤트 그래프 실행 순서 이벤트 그래프 실행 순서 생애주기(Life Cycle): 태어나서 살다가 죽는 주기
생성된 객체마다 라이프 사이클에 따라 특정 이벤트를 호출함 처음 태어났을 때: [Event Begin Play] - 최초 1회 발생
사는 동안: [Event Tick] - 1프레임마다 반복해서 호출, 매 프레임마다 갱신된 이미지를 계속 보여줌 죽을 때: [Event Destroyed] - 객체 파괴