260203 TIL - Unreal C++ 19일차, 8번과제 제출

2026. 2. 3. 21:41언리얼 7기 본캠프

오늘 코드카타에서는 재귀함수로 경우의 수를 구하는 방법에 대해서 익혔음. 재귀함수란 함수 안에서 자신을 다시 호출하는 함수이며, 값의 범위를 점점 줄여가며 반복작업을 수행하는데에는 좋지만 종료를 확실히 해두지않으면 무한루프에 빠질 수 있다는 점이 주의가 필요함. 이걸 응용해서 경우의 수를 다 파악하는 로직에 대해서 익히고 이를 통해 문제를 풀었음

 

//프로세스 문제. Queue를 활용하는 문제였던것 같은데, Vector로 Queue와 비슷하게 동작을 시켜보고싶어서
//Queue를 사용하지 않고 풀어봄

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> priorities, int location) {
    int answer = 0;
    while(!priorities.empty())
    {
        int comp = priorities[0];
        bool isQueued = false;
        for (int i = 1; i < priorities.size(); i++)
        {
            if (comp < priorities[i])
            {
                priorities.push_back(comp);
                priorities.erase(priorities.begin());
                isQueued = true;
                location--;
                if (location < 0) location = priorities.size() - 1;
                break;
            }
        }
        if (!isQueued)
        {
            priorities.erase(priorities.begin());
            answer++;
            location--;
            if (location < 0) break;
        }
    }
    return answer;
}

//피로도 문제. 아마 코드카타 하면서 처음으로 외부함수를 만들어본것 같은데... 
//DFS(Depth-First Search) 방식의 재귀함수를 통해 경우의수를 파악하고 최고값을 찾아내는 식으로 사용함
//개념이 이해하기 힘들었는데 몇번 지우고 적고 하다보니까 구조 자체는 어느정도 파악함. 반복 연습이 필요할 듯
#include <string>
#include <vector>

using namespace std;

void dfs(int k, int count, const vector<vector<int>>& dungeons, vector<bool>& visited, int& answer) {
    if (count > answer) answer = count;
    
    for(int i = 0; i < dungeons.size(); i++)
    {
        if (!visited[i] && k >= dungeons[i][0])
        {
            visited[i] = true;
            dfs(k - dungeons[i][1], count + 1, dungeons, visited, answer);
            visited[i] = false;
        }
    }
}

int solution(int k, vector<vector<int>> dungeons) {
    int answer = 0;
    vector<bool> visited(dungeons.size(), false);
    dfs(k, 0, dungeons, visited, answer);
    return answer;
}

 

길고 길었던 8번과제가 오늘로서 제출일임. 시간의 압박에 밀려 주말도 반납하고 열심히 하느라, 코드를 정리하기는 커녕 과제 내용 구현에만 급급해서 따로 아이디어를 추가로 넣어볼 생각도 못했음. 과제의 체크리스트와 비교대조하며 어떤부분을 구현했고 어떤부분이 미흡했는지 분석해봄

 

<필수 과제>
1. 한 레벨 안에서 최소 3단계(Wave 1~3) 구성이 명확하며,
각 웨이브 시작 시 아이템 스폰·타이머가 정상적으로 초기화되는가?  예

- 레벨 1 ~ 3 안에서 각각의 웨이브가 1 ~ 3 이 존재하며, 웨이브 시작마다 각 레벨과 웨이브에 맞는 아이템 스폰 데이터와 타이머로 정상적으로 초기화되게 구현하였음


2. 웨이브 종료 조건(제한 시간, 아이템 획득 등)이 정상적으로 작동하여,
“다음 웨이브”로 자연스럽게 이어지는가? 예

- 제한시간이 초과하면 자연스레 게임오버로 이어지며, 아이템을 요구치만큼 모두 획득하면 즉시 다음 웨이브로 넘어가는 형식으로 구현함


3. 점수, 시간, 체력 등 핵심 게임 정보를 한 화면에서 쉽게 확인할 수 있으며,
실제 플레이 상황에 따라 데이터가 즉시 갱신되는가? 예

- 화면 내에 점수, 시간, 플레이어 체력, 스폰된 코인과 남은 코인, 디버프 적용시 디버프의 남은 시간 등을 HUD로 구현함

 

4. 메뉴 레이아웃이 기본적으로 구성되어 있고,
버튼 클릭 시 레벨 이동, 재시작, 게임 종료 등이 정상 동작하는가? 예

- WBP Menu 안에서 게임오버 및 메인메뉴를 구성하였고, 재시작 및 메인메뉴 이동, 게임 종료까지 정상적으로 동작하게끔 구현함

<도전 과제>
1. 웨이브가 올라갈수록 스폰 개수·확률 등이 달라져 체감 난이도가 증가하는가? 예

- 레벨과 웨이브에 따라 스폰 갯수 및 확률을 변동하게 만들어 진행할수록 난이도 체감이 증가하게 만듬

 

2. 폰트, 색상, 아이콘 등 HUD·메뉴 전반에 통일성을 유지하여
시각적 완성도를 높였는가? 세모

- HUD메뉴를 다듬는다고 다듬었지만 그저 색상만 약간 조정했을 뿐 폰트를 넣지 않아서(폰트 찾아볼 시간도 없어서...) 좀 싸구려같은 느낌이 많이 난다고 생각함


3. 게임 플레이 ↔ UI 조작 시점에서 마우스 커서/입력 모드가 자연스럽게 전환되는가? 예

- 메뉴가 나올 시점에는 확실하게 커서가 나오고 그 이외에는 게임플레이로 자연스럽게 전환되게 구현함


4. UI 배경, 애니메이션 등 독창적인 디자인 요소를 적용하여
전체적인 화면 연출의 완성도가 높은가? 아니오

- 열심히 한다고는 했지만 UI와 애니메이션의 완성도가 아쉬운건 분명함


<필수 과제>
1. 웨이브 시작/종료, 타이머 사용, 스폰 로직 등이
논리적이고 일관성 있게 설계되어 있는가? 예

- 웨이브 시작 및 종료를 함수로 별개로 구현하여 정확하게 동작하게 설계하였고, 각 내용에 맞는 타이머(레벨 시간, 독, 슬로우)를 설계하여 정상적으로 동작하게 하였고 스폰 로직 또한 레벨별 데이터테이블을 통해 확실하게 스폰되게끔 설계하고 구현함
2. 언리얼의 UMG(Widget)와 변수 바인딩 개념을 정확히 이해하고,
점수·시간·체력 등 정보를 적절히 연결·사용하는가? 예

- Widget상의 텍스트박스 및 버튼 등등을 C++ 코드로 불러와서 바인딩하여 UI의 조정을 코드로 할 수 있게끔 사용함

<도전 과제>
1. 스스로 독창적인 UI/UX 아이디어를 적용하고,
불필요한 요소를 줄이거나 배치를 최적화하려는 노력이 보이는가? 아니오

- 시간에 쪼들리느라 기능 구현에만 급급해서 UI 및 UX를 너무 대충 만든 느낌이 많이 남


2. 기존 SpawnVolume, Overlap, GameState 등 로직을 효율적으로 재활용하여,
새 기능 (웨이브/디버프 등)을 확장 가능하게 설계했는가? 예

- 강의 상에서 만들었던 기능들을 재활용하여 레벨 내에서 웨이브를, 아이템중에서는 디버프를 사용하게끔 구현함


<필수 과제>
1. 3단계 이상의 웨이브 흐름과 기본 HUD·메뉴 시스템이 안정적으로 구동되어,
플레이 시 버그·오류가 최소화되었는가? 예

- 레벨 플로우는 정상적으로 동작하며, HUD와 메뉴에서 디버깅을 열심히 하여 버그가 없게끔 제대로 구현함


2. 점수·시간·체력·스폰 로직 등 핵심 기능이 유기적으로 연결되어
전반적인 게임 완성도가 높고, 플레이 경험이 매끄러운가? 세모

- 핵심 기능은 유기적으로 연결되어있지만 플레이테스트 시간이 부족해 데이터테이블을 여러번 수정하지 못해서 난이도 조절 부분이 미묘해진 부분이 있고 이에 따라 완성도가 떨어진다고 할 수도 있음


<도전 과제>
1. 웨이브가 올라갈수록 장애물·무작위 이벤트·맵 변형 등 단순 스폰 수치 이상의 난이도 상승 요인을 구현했으며, HUD나 메뉴 표시·퇴장 시 Fade/Slide 등 애니메이션을 적용하고 버튼 Hover/Click 시 모션 변화를 통해 높은 연출 퀄리티를 보여주는가? 세모

- 무작위 맵 변형등은 구현하지 못하였지만 새로 만든 디버프 포션을 웨이브 진행 및 레벨 진행에 따라 나오게 하였고, 특정 레벨에서는 조종 액터를 변경해서 난이도 상승을 꾀하였으며, HUD상 텍스트에 약간의 애니메이션을 더하였고 버튼 호버 및 클릭시 색상 변화 정도의 이펙트만 일단 주었음

 

2. 속도 감소·컨트롤 반전 등 부정적 아이템 효과가 지속 시간·중첩 로직까지 정상 동작하여 실제 플레이어에게 영향을 주었으며, WidgetComponent 등을 이용해 캐릭터 머리 위 체력바·아이템 상호작용 안내를 3D 공간에 표시하고 3D UI 클릭 등의 고급 상호작용까지 시도했는가? 세모

- 중첩 로직은 효과가 중첩되게 하려다가 난이도 문제때문에 지속시간만 다시 갱신하는 방향으로 전환했으며, 대신 지속시간 로직(타이머, 갱신)은 그만큼 확실하게 동작함. 3D위젯 구현은 시도해보지 못하였음

 

과제 영상 및 리포지토리 첨부하고 마무리함

 

이제 또 팀프로젝트 들어가는데... 잘 할 수 있겠지?

 

https://www.youtube.com/watch?v=f9A9sgfErX0

 

 

https://github.com/Nichipe-JCM/CPP_Assignment_8_JCM