오늘은 길고 길었던 Climb 기능을 일단락 하게 되었습니다.

 

우선 어제 가장 문제가 되었던 Top Exit에 대해 3가지 해결법을 준비했습니다.

1. Top Exit 시 Teleport

2. Top Exit 시 모든 Collision을 제거

3. 이동키에서 손을 뗄 시 그 즉시 정지(관성도 없음)

 

이 중 3번을 함으로써 해결법이 가시권에 들어왔습니다.

해결법은 MaxFlySpeed와 BrakingDecelerationFlying였습니다.

MaxFlySpeed는 MOVE_Fly 상태에서의 최대 속도를, BrakingDecelerationFlying은 비 이동 시 가속도를 지칭합니다.

즉, MaxFlySpeed가 50이고 BrakingDecelerationFlying이 50이면 1초동안 감속운동을 하며 멈추게 되는 것입니다.

저는 BrakingDecelerationFlying을 MaxFlySpeed의 10배로 잡아 0.1초만에 바로 정지하도록 만들었습니다.

 

이렇게 하고 나자 비로서 원하던 것이 보였습니다.

Exit From Top의 Notify는 정상 작동을 하고 있었습니다.

심지어 Animation이 벽에 막혀 재생되지 않은 것이 아니었습니다.

앞이 막혀 있다면 뒤로 밀려서 재생이 되었습니다.

그 뒤는 Input을 제한하고, ExitClimb를 지정하면서 실질적인 움직임을 맞추는 것이었습니다.

 

하지만 결국 Climb Animation 이후 실질적으로 벽에 오르지 못하는 문제에 직면했고,

이 부분을 Teleport로 해결했습니다.

Collision으로 해결하지 않은 이유는 Animation이 벽에 막혔을 때 재생되지 않은 것이 아니라, 

뒤로 밀려서라도 재생이 되기 때문이었습니다.

어차피 Character 위치는 재조정을 해야 했기 때문에, 굳이 Collision을 건들지 않고 Teleport만 사용했습니다.

 

이전에는 Teleport를 할 때 Character가 붕 뜨는 것 같아서 이를 꺼려했습니다.

하지만 이는 처음 테스트 한 Rope의 경우였고, Ladder와 Wall에서는 그렇게까지 어색하게 보이지는 않았습니다.

이는 Rope의 Animation이 더 위쪽을 잡고 올라가는 형식이라 그런 것으로 판단됩니다.

때문에 현재 상황에서는 고칠 수 없는 문제라 판단하고 이슈에서 제거했습니다.

 

많은 문제들이 해결되었지만 아직 완벽한 것은 아닙니다.

Wall은 Enter/Exit From Bottom과 Climb Up/Down Animation이 없어서 임시로만 해놓은 상태입니다.

때문에 기능도 완벽하게 작동하지 않습니다.

 

또한 Teleport 할 때 Rotation이 정상적으로 적용되지 않습니다.

Rotation을 잘못 계산한 것인지는 잘 모르겠지만,

여러 방안을 시도 했음에도 Teleport 할 때 뒤를 돈 채로 이동하지 않고 있습니다.

때문에 Enter From Top도 모든 Climb에 대해 정상적으로 작동하지 않고 있습니다.

 

그럼에도 이 기능을 이쯤에서 멈춘 이유는 과제로 제출해야하기 때문입니다.

현재 구현된 기능 중 문제가 발생하는 기능들이 존재하기 때문에 이 부분을 먼저 구현하고자 합니다.

 

그래서 다음 진행중인 일은 Trap의 MultiPlay 상에서의 기능 작동입니다.

Trap 자체는 사실 Character가 들어와 있으면 기능이 작동하기만 합니다.

하지만 그 구조가 졸속이다 보니 MultiPlay에서 한 Character로 인해 발동된 Trap이

다른 Character의 InRange로 인해 해제가 되기도 합니다.

또한 이 방식은 Trap이 1명의 Character에게만 반응하게 되어있습니다.

 

이 문제들을 해결하기 위해 Character의 InRange를 Semaphore나 Queue로 구현을 하고자 합니다.

그리고 이에 따라 ATHActorBase에서 각자 따로 구현되었던 ATH-Trap들을

ATHTrapBase 하위 Actor들로 통합하려 합니다.

오늘은 생성을 하고, 기존의 Trap들에게 있는 공통적인 선언부분만 선언해둔 상태입니다.

 

우선은 공통 기능을 구현한 뒤 상속 관계를 수정하여 무사히 Build를 하는 것이 내일 첫 목표입니다.

그 다음에는 구현한 기능을 개선하고자 합니다.

하루만에 하기 힘들 수 있지만, 내일 개발이 끝나고 시간이 남는다면 BreakPuzzle을 먼저 수정해보려 합니다.

 

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.07.06 개발일지  (0) 2020.07.06
20.07.05 개발일지  (0) 2020.07.05
20.07.03 개발일지  (0) 2020.07.03
20.07.03 개발일지 2  (0) 2020.07.03
20.07.03 개발일지  (0) 2020.07.03

Notify가 호출되지 않은 이유는 이것을 받기 위해서는 Character가 아니라

AnimInstance에서 Delegate를 생성해야 하기 때문이었습니다.

 

AnimInstance에 Notify 이벤트를 생성하고 나서, 이벤트가 호출되는 것을 확인했습니다.

다만 Top에서는 발생하지 않았는데, 구조적 문제보다는 다른 원인 때문이라 생각합니다.

 

현재는 두가지 원인을 예측합니다.

1. 이전부터 Top Exit Animation은 정상재생 되지 않고 있었다.
벽이 있을 경우 막히기 때문에 끝까지 Animation이 재생되지 않아 Notify가 발생하지 않았다.

2. Exit 한 이후로 계속해서 Character가 움직이면서 Notify에 도달하지 못했다.

 

이를 위해 3가지 방안을 생각 중입니다.

1. Top Exit 시 Teleport를 한다.

2. Top Exit 시 Character의 모든 Collision을 없애서 벽을 통과 할 수 있도록 한다.

3. 이동 키에서 손을 뗼 경우 이동속도는 물론 관성까지 모두 0으로 처리하여 완벽히 멈추도록 한다.

 

이 중 3번은 무조건 적용이 되어야 할 사항입니다.

그렇지 않으면 이벤트가 중복으로 호출될 수 있기 때문입니다.

1번은 한번 시도했던 방안이지만, 실제로 적용하면 Character가 매우 붕 뜨기 때문에 어디까지나 차선책입니다.

결국 2번이 제대로 작동 되느냐에 따라 완성도가 달라질 것 같습니다.

 

우선 내일은 3번부터 적용을 하고, Notify 발생 여부를 확인해가며 1번과 2번 중 적절한 것을 먼저 시도할 예정입니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.07.05 개발일지  (0) 2020.07.05
20.07.04 개발일지  (0) 2020.07.04
20.07.03 개발일지 2  (0) 2020.07.03
20.07.03 개발일지  (0) 2020.07.03
20.07.02 개발일지  (0) 2020.07.02

새벽에 쓴게 사실 어제 써야 할 것이 12시가 넘어서 오늘 날짜로 적었습니다.

 

어제 Animation에 Notify를 받아서 Climb를 처리하는 것에 여러 문제를 남긴채로 개발을 멈췄습니다.

오늘은 이 중 Enter From Bottom, Move up, Move Down의 Animation이 정상적으로 작동되도록 하였습니다.

오랫동안 확인해본 결과 Idle 상태에서 Move 상태로 갔을 때

바로 Exit 조건까지 만족해버려서 Exit의 한 포즈로 고정이 되어버린 것이었습니다.

Exit 조건을 바꿨더니 문제를 해결할 수 있었습니다.

 

현재 Exit까지는 조건이 만족을 하지만,

Animation이 재생이 안된는지 Notify가 받아지지 않은지 이후 진행이 되지 않습니다.

그리고 Notify를 하면서 동시에 입력 금지와 이동속도, 관성 초기화를 하여 그 즉시 멈추도록 하고자 합니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.07.04 개발일지  (0) 2020.07.04
20.07.03 개발일지  (0) 2020.07.03
20.07.03 개발일지  (0) 2020.07.03
20.07.02 개발일지  (0) 2020.07.02
20.07.01 개발일지  (0) 2020.07.01

내일 다시 시작하기 위해 내용을 정리합니다.

Animation에 notify를 넣는 방법을 찾았습니다.

이를 기반으로 처음부터 다시 만들어 보았는데,

Climb에 Enter하고 Move만 하지 그 뒤로 어떠한 것도 제대로 되지 않습니다.

 

아마 State와 Trigger가 정상 작동하지 않기 때문이라 생각합니다.

Conduit부터 시작해서 이것저것 쌓아가야 할것 같습니다.

 

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.07.03 개발일지  (0) 2020.07.03
20.07.03 개발일지 2  (0) 2020.07.03
20.07.02 개발일지  (0) 2020.07.02
20.07.01 개발일지  (0) 2020.07.01
20.06.29 개발일지  (0) 2020.06.29

원래 긴장하면 되던 일도 안되던데 지금이 그짝인 것 같습니다.

 

Teleport로 Climb를 하는 문제는 대부분 해결이 되었습니다.

Enter Climb From Top만 빼면 모든 기능은 작동합니다.

그렇게 보였습니다.

 

하지만 정신 차리고 보니, Exit Climb가 정상적으로 재생되지 않고 있었습니다.

그래서 일단 Push를 해놓고, Branch를 파서 다시 만들어보고 있습니다.

일지를 지금 쓰는 것도 미리 일지를 쓰고 마저 개발을 하기 위해서입니다.

 

과제 제출하려면 우선 하던 것은 다 되도록 마무리 해야 되는지라 압박이 조금 됩니다.

열흘 정도 시간이 남았으니 이번주 주말까지는 Climb를, 다음주 주말까지는 Trap/Puzzle을 손보고자 합니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.07.03 개발일지 2  (0) 2020.07.03
20.07.03 개발일지  (0) 2020.07.03
20.07.01 개발일지  (0) 2020.07.01
20.06.29 개발일지  (0) 2020.06.29
20.06.25 개발일지 2  (0) 2020.06.25

저번에는 Teleport를 통한 Exit Climb from Top을 기능적으로는 구현을 해봤고,

오늘은 Collision을 조절해서 Climb를 구현해보려 했습니다.

 

이를 시도해 보았으나 원하는 결과를 얻지 못하였습니다.

Mesh의 Collision 설정 뿐만 아니라 여러 Trigger도 모두 Collision 설정을 해야 하는건가 싶기도 하고

좀 복잡해서 일단 보류를 했습니다.

 

남은 시간에는 Teleport 하는 위치를 조절하였습니다.

그래도 붕 뜨게 되는 것은 어떻게 할 수가 없었습니다.

그래서 이 문제도 우선은 보류하였습니다.

 

그 다음에는 다른 Climb에 FSM을 적용해보았습니다.

현재 Montage 생성을 해서 붙여넣기만 하면 바로 테스트가 가능합니다.

 

마지막으로 Enter Climb From Top을 구현중입니다.

위치는 Teleport로 조절이 가능한데, Rotator가 원하는 방향으로 되지 않아서 남은 시간을 모두 소모했습니다.

 

그리고 잘 되는줄만 알았던 Rope가 벽에 붙어 있을 때와 그렇지 않을 때 Move Animation 재생에 차이가 발생했습니다.

단일 객체의 Rope에서의 Move 시 Animation 재생 문제를 따로 고려해봐야 할 것 같습니다.

 

내일은 먼저 Montage를 붙여서 다른 Climb에서의 상호작용을 확인해볼 것입니다.

그 다음은 Rotator 조절.

마지막으로 단일 Climb에 대한 MoveAnimation 문제를 해결할 것입니다.

 

오늘은 일지 적는 시간이 꽤 늦습니다.

또한 이래저래 보류를 하는 경우가 많습니다.

오늘 지원한 회사 중 한곳에서 연락이 왔는데, 과제를 제출하라고 하였습니다.

과제 조건을 보니 지금 개발중인 프로젝트가 어느정도 조건에 부합하여 이를 제출하겠다고 했습니다.

때문에 주어진 시간 안에 현재 개발 중인 기능만이라도 마무리를 하여야 합니다.

그렇다 보니 완벽하게는 아니더라도 대략적인 기능은 구현하려고 하는 것 같습니다.

때문에 당분간은 매일 이 프로젝트의 일지를 작성하게 될 것 같습니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.07.03 개발일지  (0) 2020.07.03
20.07.02 개발일지  (0) 2020.07.02
20.06.29 개발일지  (0) 2020.06.29
20.06.25 개발일지 2  (0) 2020.06.25
20.06.25 개발일지  (0) 2020.06.25

어제 면접을 보고 몇가지 알아볼 것이 있어서 문제를 풀지 못했습니다.

그리고 오늘은 지원한 회사에서 과제 제출을 하라고 연락을 받았습니다.

아무래도 시간이 걸릴 것 같아 제출일까지 알고리즘 문제 풀이는 비주기적으로 진행하려 합니다.

2주 정도 걸릴 것이고, 그 사이에 여유가 되면 풀 수도 있지만 대부분은 과제에 시간을 할애할 것 같습니다.

'개발일지' 카테고리의 다른 글

20.07.17 비개발일지  (0) 2020.07.17
20.07.14 비개발일지  (0) 2020.07.14
20.06.23 비개발일지  (0) 2020.06.23
20.06.13 비개발일지  (0) 2020.06.13
20.05.02 비개발일지  (0) 2020.05.02

https://www.acmicpc.net/problem/2258

 

2258번: 정육점

첫째 줄에 두 정수 N(1≤N≤100,000), M(1≤M≤2,147,483,647)이 주어진다. N은 덩어리의 개수를 의미하고, M은 은혜가 필요한 고기의 양이다. 다음 N개의 줄에는 각 고기 덩어리의 무게와 가격을 나타내는

www.acmicpc.net

사실 그저께부터 풀어보려 했으나 번번히 실패하는 문제입니다.

 

정육점에는 여러 고기 덩어리가 있고, 각 고기 덩어리는 무게와 가격이 천차만별입니다.

은혜는 본인이 필요로 하는 양의 고기를 사면 됩니다.

단, 가격이 더 싸다면 필요한 양보다 더 많은 고기를 살 수도 있습니다.

또한 자신이 구매한 고기보다 싼 고기들은 추가 지불 없이 얼마든지 구매할 수 있습니다.

 

이 때 은혜가 원하는 양의 고기를 구매하기 위한 최소 비용을 계산해야 합니다.

 

여태까지 제가 구현한 방식은 다음과 같습니다.

1. 무게합이 필요한 무게보다 작은지 비교한다.

2. 1의 결과가 참일 경우, 최소 비용의 무게와 현재 무게가 동일한지 비교한다.

3. 2의 결과가 참일 경우, 최소 비용과 현재 비용을 비교하여 더 작은 것을 저장한다.

4. 2의 결과가 거짓일 경우, 최소 비용과 그 무게를 현재 비용과 무게로 저장한다.

5. 1의 결과가 거짓일 경우, 최소 비용을 현재 무게와 비교하여 더 작은 것을 저장한다.

6. 무게합이 요구치보다 작을 경우 -1을, 클 경우 최소 비용을 출력한다.

 

하지만 9%를 넘어가는 정도에서 정답을 맞추지 못하고 실패해버립니다.

 

오늘은 이쯤에서 멈추고 내일 다시 풀어보겠습니다.

오늘 주말에 지원 했던 회사에서 한 곳, 업로드 한 제 지원서를 열람한 곳에서 한곳 연락이 왔습니다.

지원한 회사는 입사지원서를 당사 형식으로 작성해서 제출해 달라 했고, 열람한 곳은 내일 면접이 잡혔습니다.

그래서 입사지원서를 다시 작성하다 보니까 오늘 개발은 많이 하지 못했습니다.

 

하지만 그래도 그 어느때보다 효율적인 시간이었습니다.

문제를 해결했기 때문입니다.

 

저번에 Teleport를 통해 Climb의 윗 부분에 도달에 Exit 하는 문제를 해결 할 수 있는 실마리를 잡았습니다.

오늘은 이 수치를 조금 조절 했더니 갑자기 Animation이 정상적으로 재생되지 않았습니다.

 

혹시나 해서 수치를 완전히 키웠으나, 역시 제대로 작동하지 않았습니다.

여기서 저는 뭔가 잘못되었다는 것을 느꼈습니다.

코드를 다시 보니, TeleportTo 함수가 그냥 호출이 되고 있는 것이 걸렸습니다.

이전에도 Replicate 문제로 오랜 시간을 잡아 먹었기에, RPC 함수로 TeleportTo를 감쌌습니다.

 

그러자 거짓말처럼 문제가 해결이 되었습니다.

이번 문제도 역시나 RPC문제였습니다.

 

이렇게 해서 기능은 동작하지만, 영 만족스럽지 못합니다.

Teleport 해야 하는 높이가 꽤 높아 캐릭터가 붕 떠보이기 때문입니다.

 

다음에는 이 수치를 한번 조절해볼 생각입니다.

Character를 Z축으로만 이동 시켜보고, 적절하게 작동을 한다면 그대로 둘 것입니다.

만약 그렇지 못한다면, Exit 하는 동안 Mesh와 Capsule의 Overlap 상태를 조절해

Animation이 정상 재생 되는 동안 Overlap이 발생하지 않도록 해볼 계획입니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.07.02 개발일지  (0) 2020.07.02
20.07.01 개발일지  (0) 2020.07.01
20.06.25 개발일지 2  (0) 2020.06.25
20.06.25 개발일지  (0) 2020.06.25
20.06.22 개발일지  (0) 2020.06.22

https://www.acmicpc.net/problem/14731

 

14731번: 謎紛芥索紀 (Large)

성민이는 이번 학기에 미적분학 과목을 수강하고 있다. 다항함수의 미분 단원 과제를 하던 도중 미분을 하기가 귀찮아진 성민이는 미분하려는 함수 f(x)가 주어지면, 미분 된 함수 f’(x)를 자동��

www.acmicpc.net

100K개의 다항식의 도함수 f'(x)에 대해 x = 2일 때의 값을 1B + 7로 나눈 나머지를 구하는 문제이다.

매우 간단하지만, 연산 시간을 맞추는 것에 어려움이 많았다.

 

우선 차수가 1B까지 나올 수 있는 지수 연산이 문제였다.

처음에는 greedy하게 하나하나 해봤지만, 역시나 시간이 부족했다.

 

그 다음에는 2배수로 나눠서 연산을 해보려 했으나,

반대로 입력받은 지수 값을 2진수로 계산하는 것이 너무 오래 걸렸습니다.

 

결국 답은 지수를 10진수 단위로 끊는 것이었습니다.

10^n 단위로 미리 연산을 해두고, 이를 이용한 pow 함수를 따로 제작하여 이를 사용하였습니다.

 

하지만 이후에도 수차례 통과하지 못했습니다.

여러 차례 수정을 하다가 깨달은 점은, 지수 부분만 unsigned long long으로 하였으나

sizeof(unsigned int) 크기를 넘어갈 수 있다는 점이었습니다.

 

그래서 size를 제외한 모든 값을 unsigned long long으로 선언을 해주고 나서야 비로소 통과 할 수 있었습니다.

더보기
#include <iostream>
#include <vector>
#include <array>
#include <algorithm>

using namespace std;

array<unsigned long long, 10> decpow;

unsigned long long GetPow(unsigned int dec)
{
    if (dec == 0)
    {
        return 1;
    }
    int rest = 0, index = 0;
    unsigned long long output = 1;

    while (dec > 0)
    {
        rest = dec % 10;
        dec /= 10;
        for (int i = 0; i < rest; ++i)
        {
            output *= decpow[index];
            output %= 1000000007;
        }
        ++index;
    }

    return output;
}

int main()
{
    unsigned int size = 0;
    unsigned long long output = 0, a = 1, b = 0, value = 2, exp = 1;
    vector<pair<unsigned long long, unsigned long long>> input;
    decpow[0] = 2;
    for (int i = 1; i < 9; ++i)
    {
        exp = 1;
        for (int j = 0; j < 10; ++j)
        {
            exp *= value;
            exp %= 1000000007;
        }
        value = exp;
        decpow[i] = value;
    }

    cin >> size;
    for (int i = 0; i < size; ++i)
    {
        cin >> a >> b;
        if (b > 0)
        {
            input.push_back(make_pair(a * b % 1000000007, b - 1));
        }
    }

    sort(input.begin(), input.end(), [](auto& a, auto& b)
        {
            return a.second < b.second;
        });

    for (const auto& iter : input)
    {
        output += iter.first * GetPow(iter.second);
        output %= 1000000007;
    }

    cout << output << endl;
    return 0;
}

+ Recent posts