캐릭터 구현
분할 정복
5명이서 FPS/TPS 형식의 게임을 만들기로 하였음
각자 캐릭터, 적, 인게임 UI, 아웃게임 UI, 기믹(아이템)을 맡았고 나는 캐릭터를 담당하였음
뱀서처럼 웨이브마다 몰려드는 적을 처치하고 성장하며 보스까지 잡는 게임으로 기획방향을 잡았다
언리얼 기본 캐릭터 클래스 상속받고 추가 구현
카메라와 스프링 암 닮
굳이 public할 필요 없을거 같아 protected로 함. 자손에서는 접근허용하기 위해
그리고 에디터에는 볼 수만 있게 설정



먼저 컨트롤러를 캐릭터에 연결하기 위해 pawn에 정의된 NotifyControllerChanged 함수를 이용
플레이어 또는 AI 컨트롤러가 이 폰(Pawn)을 소유하거나 변경할 때 호출되는 알림 메서드
어떤 Controller가 소유하고 있음을 엔진 내부와 게임 로직에 알려주는 역할
캐릭터가 입력을 관리하고 처리하게 하고 싶어, 이전에 컨트롤러 객체에서 IMC를 등록한 것과 달리 캐릭터 내에서 처리


캐릭터 걷는 속도가 600으로 좀 빨라, 애니메이션도 성큼성큼 걷는 느낌을 주기 위해 Blend Space를 수정
일반적인 걷는 애니메이션을 500 정도로 설정하여, 걷는 속도인 600에서는 성큼성큼 걷는 느낌을 주도록 하였음
큰 문제를 작은 문제로 나누고, 작은 문제가 해결되면 다시 합쳐서 큰 문제를 해결하는 방법
쪼갠 작은 문제가 원래 큰 문제의 문제상황과 동일해야함
작은 문제로 쪼갤 때, 쪼개진 문제들끼리 서로 독립적이여야 하고, 작은 문제들의 해답이 합쳐졌을 때 큰 문제의 해답이 되어야 이 알고리즘 적용 가능
구현법으로는 재귀로 반을 쪼갠다음, 쪼개진 문제들이 해결되었으면 다시 합치면서 문제 해결하기
대표 예시로는 합병 정렬
#include <vector>
using namespace std;
vector<int> merge(vector<int> left, vector<int> right) {
int l = 0, r = 0;
vector<int> result;
// 가장 앞에 있는 녀석끼리 비교
while (l < left.size() && r < right.size()) {
if (left[l] < right[r]) {
result.push_back(left[l++]);
}
else {
result.push_back(right[r++]);
}
}
// 남은 것 다 넣기
while (l < left.size()) {
result.push_back(left[l++]);
}
while (r < right.size()) {
result.push_back(right[r++]);
}
return result;
}
vector<int> solution(vector<int> nums) {
// 분할 종료 조건
if (nums.size() == 1)
return nums;
int mid = nums.size() / 2;
vector<int> left(nums.begin(), nums.begin() + mid);
vector<int> right(nums.begin() + mid, nums.end());
// 쪼개고, 재귀돌리면서 문제 해결
left = solution(left);
right = solution(right);
// 쪼개진 문제는 해결되었으니 두 개 병합하며 해결
return merge(left, right);
}
int main() {
vector<int> answer = solution({ 5, 2, 7, 1, 3 });
return 0;
}