260120 TIL - Unreal C++ 9일차

2026. 1. 20. 22:08언리얼 7기 본캠프

갈수록 어려워지는 코드카타. 그래도 어떻게든 하루 두문제씩은 해결해보려고 노력하고 있음. 오늘은 map을 사용하는 문제들이 나왔음

처음으로 '날짜'라는 개념을 코딩으로 다뤄보았음. 다만 모든 달의 날짜가 28일까지만 있다는 제약때문에 어느정도 간단(?)하게 코드를 짤 수 있었는데, 실제 날짜 개념까지 들어가면 고려할게 많아서(윤년 계산식에 매월 바뀌는 일자 등...) 날짜 관련 라이브러리를 사용해야하지 않을까 싶음

두번째 문제는 또 시간 효율에 대해 생각해보게 되었는데... 5만명의 선수를 1백만번까지 부른다는 어찌보면 어이없는 조건때문에 find를 쓰면 택도없이 무거워져서 다른 방식으로 문제를 해결할 수 밖에 없었음

 

//개인정보 문제. 풀다가 substr 인덱스를 잘못적어서 한참 헤멤 ㅡㅡ;
#include <string>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    map<char, int> termmap;
    int curday = (stoi(today.substr(0,4))*12*28)+
        (stoi(today.substr(5,2))*28)+
        stoi(today.substr(8,2));
    for(string t : terms){
        termmap[t[0]] = stoi(t.substr(2))*28;
    }
    for(int i = 0; i < privacies.size(); i++){
        int privday = (stoi(privacies[i].substr(0,4))*12*28)+
            (stoi(privacies[i].substr(5,2))*28)+
            stoi(privacies[i].substr(8,2));
        auto it = termmap.find(privacies[i].back());
        if (privday + it->second <= curday) {
            answer.push_back(i+1);
        }
    }
    return answer;
}

//달리기 경주 문제. callings에 find를 쓰면 어마어마한 연산이 생기기 때문에
//players를 담아두는 pmap을 만들고 해당 맵을 기준으로 연산하니 시간 내에 풀 수 있었음
#include <string>
#include <vector>
#include <map>

using namespace std;

vector<string> solution(vector<string> players, vector<string> callings) {
    vector<string> answer;
    map<string,int> pmap;
    for(int i = 0; i < players.size(); i++){
        pmap[players[i]] = i;
    }
    for(string c : callings){
        int currank = pmap[c];
        string frontp = players[currank-1];
        swap(players[currank], players[currank-1]);
        pmap[c] = currank-1;
        pmap[frontp] = currank;
    }
    answer = players;
    return answer;
}

 

이후 7번과제를 진행. 오늘은 Pawn클래스로 이동 및 회전, 그리고 도전과제에 있는 중력 직접 구현까지 폰 하나로 해결함

액션 할당을 코딩으로 하는게 약간 헷갈려서 강의를 몇번 다시 봤고, tick 외부에서 DeltaTime을 받아오는 방법도 익혀서 해당 방식으로 AddController~~~ 함수들을 이용하지 않고 AddActor~~~로 직접 연산을 통해 이동 및 회전하는 원리를 익힘

키보드와 마우스의 FVector2D 값을 받아서 적용한 코드

 

그리고 중력 적용은 원리를 이해하고나니까 코드 자체는 생각보다 간단했는데, 아주 예전에 했던 ( https://jcmtil.tistory.com/17 ) LineTrace를 이용한 방식이었고, 캡슐 컴포넌트의 중심부터 바닥부분까지 라인트레이스를 Tick마다 발사하고 이 라인이 바닥과 닿았을때 지면에 있는 판정으로 치는 과정이었고, 이게 닿지 않으면 공중에 있는 판정으로서 수직 속도를 중력 가속도(일단 여기선 980.0f) * DeltaTime 만큼 -시켜서 속도를 구하고, 그 속도에 다시 DeltaTime을 곱해 이동 거리를 계산해 AddActorWorldOffset으로 위치를 지정하면서(Local로 하면 폰이 모종의 이유로 회전할경우 중력이 올바르지 않게 작용할 수 있음) 중력을 작용시켰고 닿는 판정이 되면 isGrounded라는 bool을 true로 하면서 수직 속도를 0으로 맞추고 tick으로 일어날 수 있는 오차를 보정하기위해 현재 폰 위치의 Z값 - 닿은 지면의 Z값이 오차가 있을 경우(KINDA_SMALL_NUMBER보다 클 경우) 충돌판정 없이 Z축을 지면의 Z값으로 보정해주어 캐릭터가 지면 위에 좀 더 많이 뜨거나 바닥으로 박혀버리는 문제를 해결함

 

원리를 이해하니 나름대로 할만했던 중력 구현

 

 

중력을 이렇게 구현하니 점프를 구현하는건 아주 간단했는데, 그냥 수직 속도를 +값으로 주면 알아서 위로 움직이면서 중력계산에 의해 수직속도가 계속 줄어들다가 0이 될때까지 점프가 되고, 다시 -로 내려오면서 중력작용을 하는 식으로 구현이 되었음

 

허무할정도 ^^;

 

또한 isGrounded가 false일 경우(공중에 있을 경우) MoveSpeed에 0.5를 곱해 점프중에는 이동속도가 좀 느려지게 만들어 에어스피드도 적용시킴

 

 

 

내일은 이것보다 더 어려울것으로 예상되는(?) 6축 이동 드론을 구현해보고, Gamemode에서 버튼 입력으로 Possess를 변경할 수 있는지 알아보고 그것도 구현하며 덤으로 시간이 남으면 이 Pawn의 애니메이션도 넣어볼 예정