
C++ 액터 컴포넌트 지난 강의를 통해 배웠던 컴포지션 기능을 통해 액터에 기능을 추가해준다. 먼저 비밀문 용도를 위해 계단으로 내려가는 입구쪽에 문을 추가로 설치해준다. 이제 해당 문을 움직이기 위한 Mover 컴포넌트를 생성해준다. 클래스를 생성하면 VsCode 창이 열리며, 방금 생성한 Mover.h와 Mover.cpp 파일이 열리게된다. 기존 액터의 경우 접두사로 A를 가졌다. 하지만 이번 컴포넌트의 경우 액터로 부터 상속받은 것이 아닌, 액터의 기능을 가진 컴포넌트이므로 접두사로 U를 가지는 것을 볼 수 있다. 이제 간단한 테스트를 위해 CPP의 TickComponent 함수에 간단한 로그 메시지를 출력하도록 해주었다. 이제 컴파일을 하고 이렇게 만든 Mover 컴포넌트를 비밀문에 할당해준다. ..
상속 vs 컴포지션 우리는 여태 하위 블루프린트 클래스를 생성하며 상속 기능에 대해 자연스럽게 사용해왔다. 이번엔 상속에 대해 더 깊이 알아보며, 이와 동시에 컴포지션이라는 기능에 대해서도 같이 알아본다. 우선 상속은 하위 클래스가 상위 클래스의 모든 기능을 자동적으로 물려받는 것이다. 그리고 컴포지션은 클래스 A가 클래스 B의 인스턴스를 포함한다고 말할 수 있고, 해당 기능을 사용할 수는 있지만 클래스 B에 소속된 것이 아니며 원하는 부분만 선택해서 가져갈 수 있는 것을 의미한다. 아래 예시를 살펴보자. 동물은 Live()라는 기능을 가진다. 포유류는 MakeMilk()라는 기능을 가진다. 파충류는 LayEggs()라는 기능을 가진다. 포유류와 파충류는 Live()기능을 필요로 하며, 동물에 상속되어있..

캐릭터 블루프린트 레벨을 제작하였으니, 이제 캐릭터를 만들 차례이다. 캐릭터를 만들기에 앞서 기존 던전 레벨을 살펴볼때 콜리전이 없어서 플레이시 바닥을 뚫고 내려갔던 것을 기억할 것이다. 이를 위해 바닥 메시인 SM_Floor에 콜리전을 설정해주어야 한다. 우선 해당 메시의 에디터로 들어가 박스 단순화 콜리전을 추가해준다. 하지만 기본 메시가 워낙 얇을 탓에 구성된 콜리전도 상당히 얇아보인다. 이를 디테일 탭에서 더욱 두껍게 만들어주는 것이 가능하다. 위아래로 두꺼운 것을 만들고 싶은 것이기에 박스의 Z 크기를 10으로 증가시켰다. 하지만 이 상태로는 콜리전이 위로 10 증가하여 캐릭터가 바닥 메시에서 떨어져 약간 공중을 걷는 느낌을 받을 수 있다. 이를 수정하기 위해 중앙 Z 값을 -10으로 조정하여 ..
문제링크 : https://www.acmicpc.net/problem/11728 11728번: 배열 합치기 첫째 줄에 배열 A의 크기 N, 배열 B의 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000,000) 둘째 줄에는 배열 A의 내용이, 셋째 줄에는 배열 B의 내용이 주어진다. 배열에 들어있는 수는 절댓값이 109보다 작거 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = INT_MAX; int N, M, arr[2000001]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> M; for(int..

레벨 라이팅 이제 본격적으로 빛을 이용해볼 시간이다. 던전 내부에 횃불과 샹들리에 같은 조명을 만들어보자. 먼저 횃불을 가져다 배치해주자. 처음 배치한 횃불은 그림자가 드리우지 않는다. 따라서 그림자 드리우기 기능을 활성화해줄 필요가 있다. 바로 아래 횃불 받침대로 인해 원치 않는 그림자가 생길 수도 있다. 이는 해당 구성 액터에서 다이나믹 섀도와 스태틱 섀도를 끄면 해결이 가능하다. 횃불의 밝기 및 빛이 퍼지는 정도도 수정이 가능하다. 밝기는 강도로, 퍼지는 범위는 어테뉴에이션 반경을 조절해주면 된다. 어테뉴에이션 반경은 아래와 같이 흰색 반경으로 뷰포트에 표시되는 것을 볼 수 있다. 이렇게 횃불을 조정하고, 변경사항을 해당 블루프린트로 적용하여 모든 횃불이 방금 설정한 대로 바꿀 수도 있다. 기존에 ..

루멘 & 라이트 블리딩 루멘은 언리얼 5에서 추가된 실시간 전역 조명 및 반사 엔진이다. 나온지 오래되지 않았기에 지원하지 않는 기능도 존재한다. 위 이미지의 옆면 벽 머티리얼을 보면 다른 부분과 달리 이질적인 모습을 볼 수 있다. 이는 해당 머티리얼을 구현하는 데 사용된 기능 중 루멘이 지원하지 않는 것이 존재하여 발생하는 문제이다. 따라서 해당 머티리얼의 속성을 변경해줄 필요가 있다. 해당 머티리얼을 눌러보면 머티리얼의 엘리먼트 이름에 Inst가 붙어있는 것을 볼 수 있다. 이는 진짜 머티리얼이 아니라는 것을 의미하며, 해당 머티리얼에 어떤 텍스처와 설정값을 써야 하는지 알려주는 블루프린트 같은 것이다. 해당 머티리얼을 우클릭해보면 해당 머티리얼에 대한 부모를 찾을 수 있다. 이후 해당 머티리얼에 대..

라이트의 종류 현재 작성한 레벨은 빛이 없어서 어두컴컴한 상태이다. 따라서 이번엔 빛을 추가해주며, 다양한 빛의 종류에 대해 알아보게 된다. 먼저 액터 배치 패널 라이트 부분에서 다음과 같은 라이트를 확인할 수 있다. 디렉셔널 라이트의 주요 용도는 햇빛이다. 빛의 방향만을 조절해주기 때문에, 어디에 배치하든 조명 위치는 중요하지 않다. 스카이 라이트는 반대로 모든 범위에서 나오는 빛이다. 그런데 처음에 배치하면 빛이 존재하지 않는다. 이는 스카이 라이트가 멀리 떨어진 빛을 캡처해 씬에 적용하는 것이기 때문이다. 따라서 레벨 전체를 감싸고 있는 구를 추가하고, 해당 구에서 빛을 가져오게 된다. 바로 적용되지 않고, 직접 리캡처 기능을 눌러 적용시켜주어야할 때가 있다. 이는 스카이라이트 디테일 탭에서 눌러주..
문제링크 : https://www.acmicpc.net/problem/2230 2230번: 수 고르기 N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 2000000001; int N, M, arr[100001]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> M; for(int i=0; i..

솔루션 : 모듈식 레벨 레이아웃 구현 저번에 마련한 기본적인 틀을 토대로 더욱 다양한 배치를 이어나가게 된다. 천장, 문, 기둥, 감옥, 지하동굴, 대영묘 등을 이번에 추가로 배치해준다. 먼저 천장이다. 4분할 화면을 통해 기존 배치된 에셋과 비교하여 정확한 배치를 할 수 있다. 하나를 배치한 이후에, Alt + 원하는 방향을 통해 복제하여 배치해준다. 안마당에 던전으로 들어가는 문도 설치해준다. 처음 문에 대한 에셋을 검색하면, 모듈식 에셋이기 때문에 문의 요소가 나눠져서 있다. 따라서 다 조립된 상태인 BP 클래스의 에셋을 사용할 수도 있다. 이후 열려있는 문을 만들어주기 위해 안쪽 나무문의 Z 각도를 조절하여 밖 또는 안쪽으로 열어 줄 수 있다. 천장이 연결되는 곳마다 기둥을 설치해주고, 천장 부분..

모듈식 레벨 레이아웃 아무것도 없는 빈 레벨을 생성했으므로, 저번에 다운받은 에셋을 이용하여 디자인했던 내용을 토대로 레벨을 만들어나가야 한다. 배치는 다방면에서 에셋의 배치를 체크하기 쉬운 4분할 화면으로 진행하게 된다. 배치를 할때는 그리드라는 기능을 이용할 수 있다. 그리드 기능은 현재 에셋을 움직이는 단위를 조정할 수 있는 기능이다. 만약 100으로 설정한다면, 에셋을 움직일때 100씩 움직이는 것을 확인할 수 있다. 먼저 던전의 입구를 시작할 간단한 안마당을 만들어주었다. 바닥 에셋으로 SM_Floor을 사용하였다. 그리고 해당 에셋을 아웃라이너에서 묶어 안마당이라는 폴더를 따로 작성하여 관리에 용이하도록 해준다. 해당 폴더 좌측 눈모양 표식을 누르면 해당 폴더의 에셋들이 전부 뷰포트에서 사라지..
문제링크 : https://www.acmicpc.net/problem/2212 2212번: 센서 첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int N, K, arr[10001], dist[10001]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> K; ..
문제링크 : https://www.acmicpc.net/problem/1302 1302번: 베스트셀러 첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; map m; int N, maxV; string S, result; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0;..

모듈식 레벨 디자인 저번에 실행했던 레벨을 통해 좀 더 꼼꼼히 살펴보면서 어떤 빌딩 블록이 있는지 파악하고, 디자인을 시작하게 된다. 먼저 빌딩 블록들을 더 자세히 살펴보자. 현재 라이팅이 켜진 상태에서는 빌딩 블록을 자세히 파악하는데 어려움이 있어, 언릿 상태로 바꿔서 살펴보게 된다. 각각의 에셋들을 눌러보면, 모듈식으로 하나하나 조립하여 완성된 모습을 갖춘 것을 볼 수 있다. 그리고 이러한 에셋들의 메시가 어떤 것을 사용했는지 알고 싶다면, 해당 에셋을 누르고 디테일 탭의 스태틱 메시를 체크하여 확인이 가능하다. 또 해당 에셋의 화면을 4분할 하여 현재 화면 뿐만 아니라 해당 에셋에 대해 후면, 오른쪽, 상단의 시야로 확인이 가능하다. 현재 보고 있는 화면은 언릿 상태이지만, 나머지는 와이어프레임으로..

프로젝트 셋업하기 이번 섹션의 목표는 감옥같은 맵에서 숨겨진 지하 동굴을 지나 보물을 훔쳐내는 게임을 만드는 것이다. 숨겨진 지하동굴로 가는 길은 조각상을 특정 위치에 놓으면 열리게 된다. 보물의 경우 그냥 가져가면 보물 방의 문이 닫히게 되며, 대신 올려놓을 것이 필요하다. 이를 구현하기 위해 문을 움직일 Mover 컴포넌트, 조각상을 잡을 Grabber 컴포넌트, 위에 올라온 것을 확인해줄 Pressure plate 등이 필요하게 된며, 이번 섹션을 통해 하나씩 구현을 해나가게 된다. 먼저 이번 섹션을 위한 새로운 프로젝트를 셋업을 해주자. 이번 섹션을 위해 또 새로운 에셋을 다운받게 되며, 이번에 사용할 에셋은 Medieval Dungeon 에셋이다. 해당 에셋은 언리얼 5.3 버전을 지원하기 때문..
문제링크 : https://www.acmicpc.net/problem/11656 11656번: 접미사 배열 첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000보다 작거나 같다. www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; string s; vectorv; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> s; for(int i=0; i