
인풋 처리하기 프로젝트 세팅에 엔진->입력을 보면 기본적인 상하좌우 이동에 대한 축 매핑과 발사체를 발사하는 액션 매핑이 되어있다. 여기서 축 매핑을 더 자세히 살펴보자. 축 매핑은 매 프레임마다 작동하여 축 매핑 처리를 하게 된다. 함수와 연결을 시켜주며, 함수 Move(float value)와 연결되었다고 가정을 하자. 해당 함수를 축 매핑에 연결시키는 것을 바인딩한다고 한다. WASD 옆에 있는 스케일의 값이 Move의 value 값으로 들어가게 된다. 이제 바인드시킬 함수를 직접 작성해보자. 우선 인풋을 처리해주는 SetupPlayerInputComponent 함수가 필요하다. 이는 BasePawn 파일에 존재하지만, 생각을 해보면 굳이 BasePawn에 있을 필요는 없다. 이동은 탱크에서만 하기..
문제링크 : https://www.acmicpc.net/problem/15688 15688번: 수 정렬하기 5 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이며, 같은 수가 여러 번 중복될 수도 있다. www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = INT_MAX; int N, arr[1000001]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> a..

폰(Pawn)에 빙의하기 언리얼의 기본 설정으로 아무것도 지정되지 않은 상태에서 플레이를 누르면 빈 공간을 자유롭게 돌아다닐 수 있다. 이는 우리가 원하는 것이 아니며, 우리가 만든 탱크에 빙의해야 한다. 이를 위해 해당 탱크를 누르고, 플레이어 자동 빙의 기능을 사용하게 된다. 플레이어가 0~7까지 존재하는데, 플레이어 여러명이 같은 컴퓨터를 사용할 때 의미있는 것이다. 우리는 1명이서 하기 때문에 무조건 Player 0을 사용하게 된다. 이제 실행을 해보면 이제 우리가 세팅했던 카메라 각도로 탱크를 바라보게 된다.

하위 C++ 클래스 생성하기 탱크와 터렛은 베이스폰을 기준으로 기본적인 기능을 상속받지만, 둘의 구체적인 기능은 조금씩 다르다. 대표적인 것이 터렛은 움직일 필요가 없고, 탱크는 움직여야 한다. 따라서 기본 베이스폰 클래스를 기준으로 하위 C++ 클래스를 생성하여 구체적인 기능을 기술해줄 필요가 있다. 탱크는 추가적으로 탱크를 포커스하기 위해 카메라 컴포넌트와 스프링 암 컴포넌트가 필요하다. 스프링 암 컴포넌트는 카메라와 탱크를 이어주는 역할을 한다. 두 컴포넌트를 추가해주면 카메라의 시선으로 탱크를 보는 것이 가능하다. 이제 Tank 클래스에서 두 컴포넌트들을 선언해주자. 처음에는 생성자가 없는데, CreateDefaultSubobject 함수 사용을 위해 생성자를 만들어주어야 한다. 이제 컴파일을 하..

컴포넌트 노출 본격적인 컴포넌트 노출에 앞서서, 추가로 알아야할 내용이 있다. 바로 UPROPERTY() 지정자중에서 이벤트 그래프와 관련된 것들은 private로 선언이 불가능하다. 우리가 기존해 선언했던 컴포넌트들은 private이므로, 사용이 불가능하게 되는 것이다. 이를 위해서 추가로 작성해야 하는 내용이 있다. 위 문구를 적으면 C++에서는 여전히 private지만, 언리얼 이벤트 그래프에서는 접근이 가능하게 된다. 이를 토대로 컴포넌트들을 노출시켜주자. 어디에서나 보일 수 있고, 블루프린트에서 읽는 것이 가능하며, 카테고리는 컴포넌트로, private지만 블루프린트에서 사용가능하도록 해주었다. 이제 블루프린트에서 해당 컴포넌트들에 대한 디테일 패널이 활성화된다. 우선 스태틱 메시 컴포넌트에 메..
문제링크 : https://www.acmicpc.net/problem/5635 5635번: 생일 어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오. www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = INT_MAX; int N; struct info { string name; int day, month, year; }; bool cmp(struct info a, struct info b) { if (a.year < b.year) return 1; //생일이 빠른 순 else if (a.year == b.yea..

노출된 변수 편집 저번에 이어서 더 다양한 UPROPERTY()에 대한 지정자와, 이벤트 그래프에도 노출시키는 방법에 대해 알아본다. 저번엔 인스턴스에서만 보이게하는 기능을 배웠었지만, 마찬가지로 디폴트에만 보이게하기 또는 디폴트에서만 편집하기 또는 인스턴스에서만 편집하기도 가능하다. 그리고 이벤트 그래프에 노출시키는 것또한 가능하다. 여기서도 읽기만 할 것인지, 읽기 쓰기 모두 할 것인지 조절이 가능하다. 또한 지정자를 하나만 작성하는 것이 아니라, 2가지 이상을 작성해보는 것도 가능하다. 테스트로 어디서나 볼 수 있고, 이벤트 그래프에서 읽기 쓰기가 모두 가능한 상태의 변수를 선언해보았다. 이벤트 그래프에서 Test에 대한 변수를 가져오거나, 세팅하는 것이 가능하다. 가져온 Test 변수를 통해서 s..

인스턴스 대 디폴트 우리가 VScdoe를 통해 작성한 것을 언리얼로 노출시키는 데에는 UPROPERTY()가 필요하다. 괄호 안에 추가적으로 EditAnywhere, VisibleAnywhere 등을 작성해줄 수 있다. 해당 내용을 작성해주기에 앞서 블루프린트 패널과 인스턴스 패널 어디에 값을 노출시켜주는지 알 필요가 있다. 먼저 우리가 만든 BP_PawnTank의 디테일 패널을 보면 기본적인 디폴트 블루프린트가 존재한다. 여기에는 해당 블루프린트에 대한 모든 기본적인 정보가 담겨있다. 해당 BP_PawnTank를 뷰포트로 드래그하면, 인스턴스가 된다. 우리가 작성하고자 하는 VisibleAnywhre는 디폴트와 인스턴스 둘 다 노출된다. 하지만 VisibleInstanceOnly는 이름 그대로 디폴트에..

블루프린트 클래스 파생 우리가 만든 BasePawn을 기반으로, 탱크와 터렛을 위한 블루프린트 클래스를 만들어보자. 이를 위해 따로 블루프린트의 폰용 폴더를 만들어서 해당 위치에 저장하도록 해주었다. 이제 좌측 상단의 컴포넌트를 보면 우리가 만들었던 컴포넌트들이 전부 존재하는 것을 볼 수 있다. 하지만 해당 컴포넌트들을 눌러보면 우측에 디테일 창에 아무것도 뜨지 않는 것을 볼 수 있다. 해당 컴포넌트에 대한 프로퍼티는 C++ 에서 지정해야하기 때문에 언리얼 디테일 창에서는 아무것도 뜨지 않는다. 따라서 캡슐 컴포넌트를 가져오고 크기를 조정하거나, 우리가 원하는 메시를 스태틱 메시 컴포넌트에 할당하기 위해서는 프로퍼티를 노출시켜주어야 한다. 이는 다음 강의에서 이어서 진행된다.
문제링크 : https://www.acmicpc.net/problem/19621 19621번: 회의실 배정 2서준이는 아빠로부터 N개의 회의와 하나의 회의실을 선물로 받았다. 각 회의는 시작 시간, 끝나는 시간, 회의 인원이 주어지고 한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다. 단,www.acmicpc.net#include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, s[26], e[26], n[26];int result;void func(int idx, int sum){ if(idx >= N) { result = max(result, sum); ..

스태틱 메시 컴포넌트 저번 캡슐 컴포넌트에 이어서 스태틱 메시 컴포넌트를 생성할 차례이다. 큰 틀은 저번 강의와 거의 동일하다. 탱크를 위한 베이스와 터렛 부분 2가지를 생성하게 된다. 스태틱 메시 컴포넌트의 경우 클래스 전방 선언이 필요없다. 스태틱 메시 컴포넌트는 기본적으로 모든 액터에 포함되는데, 우리가 사용하고 있는 폰은 액터에서 상속된 클래스이기 때문이다. 헤더 오류 방지를 위해 그냥 클래스 전방 선언을 선언해버리는 것도 하나의 방법이기는 하다. 이번 경우는 이미 포함되어있는데 클래스 전방 선언을 해버리는 것이라 중복되는 케이스이나, 언리얼 엔진 타입의 파일에는 여러 번 포함되지 않도록 하는 보호 장치가 존재하여 상관은 없다. 헤더 파일 보다 위에 존재하는 #pragma once가 그 보호 장치..

캡슐 생성 캡슐 컴포넌트를 직접 생성해볼차례이다. CreateDefaultSubobject()라는 템플릿 함수를 통해서 생성하게 된다. 템플릿 함수이므로 우리가 원하는 컴포넌트인 UCapsuleComponent를 안에 넣어주게 되고, 이름은 () 안에 넣어준다. 또한 해당 함수는 생성자에서만 실행 가능한 함수이다. 안에 UCapsuleComponent를 넣음으로서 우리는 UCapsuleComponent를 사용하게 된다. 따라서 전방 선언만 했던 저번 강의와 달리, 이번엔 해당 헤더 파일을 선언해줄 필요가 생긴다. 그리고 CreateDefaultSubobject는 새로 생성된 컴포넌트의 주소를 반환하며, 우리가 미리 선언했던 UCapsuleComponent 포인터에 저장하게 된다. 이제 캡슐 컴포넌트를 루..

전방 선언 우리는 이제 BasePawn에 캡슐 컴포넌트, 스태틱 메시 컴포넌트 등이 필요한 것을 알고 있다. 이제 VScode에서 간단하게 캡슐 컴포넌트를 선언해보자. 현재 컴파일러가 UCapsuleComponent가 무엇인지 모르므로, 헤더파일을 선언해주어야 한다. 해당 내용은 "Components/CapsuleComponent.h"에 들어있다. 위 헤더파일을 선언해주면 간단하게 해결된다. 하지만 우리는 UCapsuleComponent 타입을 선언하는 것만 원하는 것이지, 해당 헤더파일에 있는 다른 기능들을 원하는 것이 아니다. 헤더를 선언하면 헤더에 속한 모든 내용을 가져오게 되므로, 파일의 용량이 커지게 된다. 이를 방지하기 위해 사용하는 것이 전방 선언이다. 전방 선언은 새 포인터를 선언할 때 사..
문제링크 : https://www.acmicpc.net/problem/1059 1059번: 좋은 구간 [9, 10], [9, 11], [9, 12], [10, 11], [10, 12] www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = INT_MAX; int L, n, arr[51]; int s, e, cnt; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> L; for(int i=0; i> arr[i]; cin >> n; sort(arr, arr+L); for(int i=0; i

컴포넌트 생성 이번에는 우리가 생성했던 BasePawn이 필요한 컴포넌트에 대해서 살펴본다. 클래스에 컴포넌트를 추가할 때는 해당 컴포넌트가 어떤 클래스에 속하는지를 결정해야한다. 다음 선택지를 살펴보자. 씬 컴포넌트 - 변형과 같은 속성이 있음 - 트랜스폼, 어태치먼트이 가능 - 시각적 표현이 불가능 캡슐 컴포넌트 - 씬에서 상속 - 충돌을 처리가 가능 스태틱 메시 컴포넌트 - 씬에서 상속 - 시각적 표현이 가능 우선 폰 클래스의 기본 컴포넌트로 루트 컴포넌트가 존재한다. VScode에서 루트컴포넌트를 작성하고 정의로 찾아가보면, 액터에 속해있으며 씬 컴포넌트로 되어있는 것을 볼 수 있다. 따라서 루트 컴포넌트를 캡슐컴포넌트로 재할당해줌으로서 충돌 처리를 해주고, 쓰태틱 메시 컴포넌트를 붙여줌으로서 메..