
이전 강의로 컨트롤러 조준에 대한 내용이 존재하지만, 해당 강의는 패드를 통한 캐릭터 이동에 관한 내용이다.현재 키보드 및 마우스로 강의를 진행하고 있기에 해당 내용 시청만하고 내용 작성은 스킵하였다. 3인칭 카메라 스프링 암현재 캐릭터의 카메라를 조정하여 3인칭으로 보이도록 조절해보자.캐릭터 블루프린트에서 카메라 컴포넌트를 우선 생성해주자. 그리고 해당 카메라의 위치를 조정해보자. 현재 상태에서 플레이를 해보면 다음과 같은 화면을 볼 수 있다. 이 상태에서 마우스를 통해 회전을 해보면 현재 위 아래 회전이 불가능한 상태이다.추가적으로 벽 쪽으로 가면 다음과 같이 벽을 통과해서 보고 있는 것을 볼 수 있다. 우선 위아래 회전 문제를 해겨해보자.이는 카메라 디테일 패널에 있는 폰 제어 회전 사용을 활성화하..
문제링크 : https://www.acmicpc.net/problem/2535#include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, n1, n2, n3;mapm;struct info{ int country; int student; int grade;};vectorv;bool cmp(info a, info b) //성적 순 정렬{ return a.grade > b.grade;}int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> n1 >> n2 >> n3; ..

캐릭터 이동 기능이번에는 캐릭터의 기본적인 상하좌우 이동과 점프를 구현해준다.우선 프로젝트 세팅으로 가서 상하좌우에 대한 축 매핑을 생성해주자.상하좌우의 경우 스케일 값을 통해서 하나의 축(상하, 좌우)으로 해결이 가능하다. 이제 이를 토대로 VScode에서 바인딩 작업을 해주자.우리가 사용할 함수는 다음과 같다.AddMoveMentInput() 기본적으로 벡터를 받아서 이동할 방향을 알려줌AddControllerPitchInput() : 위 아래를 바라보는 기능AddControllerYawInput() : 왼쪽 오른쪽으로 바라보는 기능Jump() : 점프 축의 경우 AxisValue가 딱히 필요없기에 해당 함수가 위한 곳에 연결하여 바로 작성하는 것이 가능하다.축에 관련한 이동 함수는 APawn에..

C++에서 폰(pawn)과 캐릭터의 차이점저번 섹션에서도 다룬 내용이지만, 이번 섹션을 통해서 좀 더 자세히 다뤄보게 된다.우선 직접 비교를 위해 pawn과 character 모두 C++ 클래스로 생성해보자. 그리고 각 C++ 클래스를 기반으로 다시 블루프린트를 생성하고 컴포넌트를 살펴보자. 위 이미지와 같이 pawn 경우 있는 것이 별로 없지만, character의 경우 캡슐과 화살표, 캐릭터 무브먼트 등이 추가로 존재한다.character의 경우 기본적으로 pawn에서 상속된 것으로 pawn의 기능을 가지고 있으나, 추가적으로 위와 같은 기능들을 가지게 되는 것이다. 우선 캡슐의 경우 대략적인 물리학, 조작, 지형과의 충돌 등을 구현하기 위한 것으로 우리가 만들 캐릭터가 해당 캡슐 안에 들어가게 된다..

이번 섹션의 목표는 우선 애니메이션 동작을 가진 3인칭 캐릭터를 이용하여 적을 물리치는 게임을 만드는 것이다.플레이어는 사격 매커니즘을 가지고 사격을 하게 되며, 적은 사격 AI를 가지고 플레이어를 쫒아와서 사격을 하게 된다.적 섹션과 마찬가지로 먼저 체력을 0으로 만드는 쪽이 승리하게 된다. 또한 이번 섹션을 위한 각종 에셋팩이 강의자료로 올라와있으므로 해당 자료를 다운받아야 한다.그리고 강의가 언리얼 엔진 4.25 버전을 사용하고 나는 언리얼 엔진 5를 사용하므로 이 점에 유의하도록 하였다. 프로젝트 셋업하기우선 이번 프로젝트를 위한 자료를 다운받고 시작하자.각 자료를 압축을 풀고, 각 폴더의 내용을 하나로 합쳐주자. 해당 에셋은 하나의 프로젝트로 되어있다.이를 실행해주고 마이그레이션 기능을 통해 ..
문제링크 : https://www.acmicpc.net/problem/24417#include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;const int MOD = 1000000007;int N;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; ll a = 1, b = 1; //더할 값 2가지 for(int i=2; i 언듯보면 웰노운으로 잘 알려진 dp 식을 이용해 피보나치를 푸는 문제이다.하지만 이렇게 풀 경우 N의 값이 최대 1억이기에 여기에만 메모리가 400MB가 사용되고,DP 중간 계산과정에서 추가적인 메..

다듬기 및 마무리이제 마무리할 단계이다.그전에 몇가지 개선사항을 짚어보고 수정을 해보도록 하자. 첫 번째로 카메라 움직임을 더 부드럽게 조정해보자.이는 탱크에서 스프링암을 선택하면 볼 수 있는 지연 기능을 통해 조절할 수 있다.여기서 카메라 렉과 회전 렉을 활성화 해주었다.이러면 카메라가 약간 지연되면서 탱크를 부드럽게 따라오게 된다.이에 대한 수치는 카메라 지연 속도와 회전 지연 속도의 값을 조절하여 얼마나 지연 되서 따라오게 할 지 선택할 수 있다.해당 값 또한 정답이 없기에 개인의 취향에 맞게 테스트해보고 값을 선택하면 된다. 두 번째로 탱크가 죽은 뒤에도 포탑이 탱크를 향해 발사체를 발사하는 것을 수정해보자.이는 간단하게 bool 타입 변수를 선언해서 활용함으로서 해결할 수 있다. 탱크가 죽었을 ..

카메라 셰이크이번엔 역동적인 움직임 연출을 위해 카메라 셰이크 기능을 추가해준다.이러면 발사체가 대상을 맞추면 카메라가 흔들리게 된다. 언리얼 엔진에는 카메라 셰이크를 위한 내장 클래스가 존재한다.우선 C++ 클래스가 아닌 블루프린트 클래스를 생성하는데, 이는 카메라 셰이크에 변수가 많아서 블루프린트 클래스에서 작업하는 것이 훨씬 쉽기 때문이다. 먼저 발사체가 부딪혔을 때의 카메라 셰이크를 만들어주자. 그리고 얼마나 흔들릴지 진동 값을 조절해주어야 한다.자세한 수치는 직접 테스트해보며 조정해보는 것이 좋다.우선 강의에서 나온 수치를 그대로 적용하였다. 각각의 변수는진동이 지속되는 시간, 카메라 흔들림이 시작될 때 까지의 시간, 카메라 흔들림이 종료될 때까지의 시간을 의미한다. 추가적으로 위치 진동의 값도..

사운드발사체가 발사됐을 때와 탱크나 터렛이 죽었을 때의 사운드를 추가해주자.이를 위해 발사체에 발사시 사운드와 히트 사운드, 베이스폰에 데스 사운드 이렇게 총 3개가 필요하다.우선 발사체에서 사운드 변수를 선언해주자.사운드를 위해서 UBaseSound 타입 포인터 변수를 사용하게 된다. 같은 변수를 2개 사용하기에 앞에만 전방선언 해줘도 뒤에 변수는 해줄 필요가 없다.또는 미리 전방선언을 따로 해주는 방법도 있다. 그리고 베이스폰에서도 선언해주자. 이제 언리얼로 돌아가서 각각에 맞는 사운드 파일을 할당해주자.여기서 Launch Sound와 Hit Sound는 같은 걸로 할당해주었다. Death Sound의 경우 탱크와 터렛 각각에 할당해주어야 한다. 이제 사운드를 재생시키는 방법을 알아야 한다.사운드 ..
문제링크 : https://www.acmicpc.net/problem/16212#include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;int arr[500001];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> arr[i]; sort(arr, arr+N); for(int i=0; i 간단한 정렬 문제이다.힌트에 주어진 것 처럼 sort 함수를 사용하면 매우 간단하게 풀이가 가능하다.

죽음 파티클이번에는 폰이 죽었을 때의 파티클을 추가해주자.이를 통해 포탑이나 플레이어(탱크)가 죽었을 때 좀 더 실감나는 모습을 보여줄 수 있다.폰에 해당하는 포탑과 탱크 모두에 대해서 구현하기 때문에, 코드 작성은 BasePawn에서 하게된다. 그리고 이번에는 죽는 순간에 파티클을 생성해주는 것이기 때문에 SpawnEmitterAtLocation 함수를 사용하여 파티클을 구현하게 된다.이를 위해 우선 UParticleSystem 타입 포인터 변수를 선언해주자. 그리고 cpp 파일에서 구현하게 되는데 죽음에 관한 내용이므로 전에 작성해뒀던 HandleDestruction 함수에서SpawnEmitterAtLocation 함수를 작성하게 된다. 이제 언리얼로 돌아가서 죽음 파티클을 할당해주자.이는 탱크와 터..

연기 궤적기존 발사체가 발사될 때 추가적으로 연기 궤적이 발사체에 붙어서 발사되도록 해주자.발사체를 따라 연기 궤적이 쭉 나타나야 하므로 발사체의 루트 컴포넌트에 추가적인 컴포넌트를 붙여주게 된다.이 또한 파티클 시스템이므로 우리가 사용할 컴포넌트는 UParticleSystemComponent이다.해당 컴포넌트에는 템플릿이라는 변수가 존재하며, 해당 변수를 통해 언리얼에서 우리가 사용할 파티클을 할당하게 된다.간단하게 Projectile 헤더에서 선언을 해주고 생성자에서 생성해주자.여기서 해당 컴포넌트를 실질적으로 사용하기 때문에 관련 헤더를 cpp내에 선언해줄 필요가 있다. 다음으로 전에 여러번 해봤듯이 CreateDefaultSubobject를 통해 생성해주고, 이를 루트컴포넌트에 붙여주자. 이제 언..
문제링크 : https://www.acmicpc.net/problem/17271 17271번: 리그 오브 레전설 (Small)규환이는 리그 오브 레전설이라는 게임을 좋아한다. 이 게임에서는 N초의 시간 동안 싸움을 하는데, 규환이가 플레이하는 캐릭터는 A, B 두 가지 스킬을 사용할 수 있다. A 스킬의 시전 시간은 1www.acmicpc.net#include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, M;int dp[10001];const int MOD = 1000000007;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); c..

타격 파티클 현재 발사체를 발사할 때 타격효과가 없어서 다소 심심하게 느껴진다. 이를 개선하기 위해 발사체에 대해 타격 파티클을 추가해주자. 파티클은 맨 처음 해당 강의를 위해 다운받은 자료에 기본으로 들어있는 것을 사용한다. 먼저 발사체 클래스에서 UParticleSystem에 대한 변수를 선언해주어야 한다. 컴파일을 하고 언리얼에서 위 파티클을 직접 할당해주자. 이제 할당한 파티클을 발사체가 무언가를 맞히는 순간 스폰함으로서 파티클을 사용하게 된다. 이를 위해 다음과 같은 함수를 사용한다. 해당 함수는 언리얼 공식 문서에서 가져온 내용이나, VScode 에서 해당 함수를 살펴보면 오버로드 된 함수가 추가로 존재하는 것을 볼 수 있다. 우리는 그 중에서 하나를 선택하여 사용할 것이며, 해당 함수는 다음..

게임 오버 UHD 게임 승패 유무에 대해 간단하게 print string으로 표시했었지만, 이제 위젯으로 출력해보록하자. 이를 위해 기존 위젯을 복사하여 게임 승패용 위젯을 하나 만들어주자. 이후 Create Widget을 통해 위젯을 생성하고, 해당 return value에서 Display Text를 얻는 것이 가능하다. 또 Display Text에서 Set Text를 얻는 것이 가능하여 원하는 텍스트를 위젯을 통해 출력이 가능하다. 하지만 우리는 게임 승패 유무를 체크하는 bool 타입 변수를 사용하고 있지 않다. 이를 활용하여 게임 승패에 맞는 텍스트를 출력해줄 필요가 있다. 이때 사용할 수 있는 것이 Select 함수이다. 해당 함수를 통해 인덱스를 받고, 리턴 값 또한 원하는 것으로 조절이 가능..