TIL_051: Into The Paradox 캐릭터 구현, 분할 정복

김펭귄·2025년 10월 23일

Today What I Learned (TIL)

목록 보기
51/111

오늘 학습 키워드

  • 캐릭터 구현

  • 분할 정복

1. Into The Paradox

  • 5명이서 FPS/TPS 형식의 게임을 만들기로 하였음

  • 각자 캐릭터, 적, 인게임 UI, 아웃게임 UI, 기믹(아이템)을 맡았고 나는 캐릭터를 담당하였음

  • 뱀서처럼 웨이브마다 몰려드는 적을 처치하고 성장하며 보스까지 잡는 게임으로 기획방향을 잡았다

2. 캐릭터 구현

  • 언리얼 기본 캐릭터 클래스 상속받고 추가 구현

  • 카메라와 스프링 암 닮

  • 굳이 public할 필요 없을거 같아 protected로 함. 자손에서는 접근허용하기 위해

  • 그리고 에디터에는 볼 수만 있게 설정

Default Pawn Class로 설정

  • 생성한 캐릭터 객체가 게임 시작 시 생성될 수 있도록, 게임 모드에서 설정

  • 캐릭터 블루프린트를 이용해 스프링암 위치를 수정하고 인게임 내에 잘 생성되는지 확인

Movement Input 처리

  • 먼저 컨트롤러를 캐릭터에 연결하기 위해 pawn에 정의된 NotifyControllerChanged 함수를 이용

  • 플레이어 또는 AI 컨트롤러가 이 폰(Pawn)을 소유하거나 변경할 때 호출되는 알림 메서드

  • 어떤 Controller가 소유하고 있음을 엔진 내부와 게임 로직에 알려주는 역할

  • 캐릭터가 입력을 관리하고 처리하게 하고 싶어, 이전에 컨트롤러 객체에서 IMC를 등록한 것과 달리 캐릭터 내에서 처리

Bind

  • 이전 프로젝트와 비슷하게 이동, 달리기, 점프, 카메라 회전을 구현

  • ETriggerEvent에서 Start로 하면, 한 번만 실행되게, Triggered로 하면, 누르는 동안 계속 실행되게 bind

애니메이션 설정

  • 캐릭터 걷는 속도가 600으로 좀 빨라, 애니메이션도 성큼성큼 걷는 느낌을 주기 위해 Blend Space를 수정

  • 일반적인 걷는 애니메이션을 500 정도로 설정하여, 걷는 속도인 600에서는 성큼성큼 걷는 느낌을 주도록 하였음

3. 분할 정복

  • 큰 문제를 작은 문제로 나누고, 작은 문제가 해결되면 다시 합쳐서 큰 문제를 해결하는 방법

  • 쪼갠 작은 문제가 원래 큰 문제의 문제상황과 동일해야함

  • 작은 문제로 쪼갤 때, 쪼개진 문제들끼리 서로 독립적이여야 하고, 작은 문제들의 해답이 합쳐졌을 때 큰 문제의 해답이 되어야 이 알고리즘 적용 가능

  • 구현법으로는 재귀로 반을 쪼갠다음, 쪼개진 문제들이 해결되었으면 다시 합치면서 문제 해결하기

  • 대표 예시로는 합병 정렬

#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;
}
profile
반갑습니다

0개의 댓글