Post

KDT Unity 2주차~4주차 몬스터문제

2023-12-04 TIL

알고리즘 문제

오늘의 알고리즘 문제 : 부족한 금액 계산하기

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다. 놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요. 단, 금액이 부족하지 않으면 0을 return 하세요.

1
2
3
4
5
6
7
8
9
using System;

class Solution
{
    public long solution(int price, int money, int count)
    {
        return -1;
    }
}

Desktop View

해결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;

class Solution
{
    public long solution(int price, int money, int count)
    {
        long result = 0;
        for(int i = 1; i <= count; i++)
        {
            result += price * i;
        }
        return result - money > 0? result-money : 0;
    }
}

for(int i = 1; i <= count; i++)문을 이용하여 이용할 때마다 증가하는 값을 long result에 합연산 해줍니다.

result - money > 0? result-money : 0; 삼항 연산자를 사용하여 지불해야하는 값인 result지불해야하는 값이 더 큰 경우에는 가지고 있는 돈인 money을 뺀 을 아니라면 0을 리턴합니다.

Desktop View

팀 프로젝트

문제 1. 몬스터가 왜 날라가요?

Desktop View

캐릭터랑 부딪힌 몬스터는 날아가면 안되고 캐릭터를 계속 쫒아와야 했습니다.

그런데 부딪치자 날아가는 모습을 보입니다.

해결법? velocity를 MovePosition으로 바꿔보자!

캐릭터의 움직임은 현재

1
2
3
4
    direction = direction * _ability.Speed;

    _rigidbody.velocity = direction;

으로 velocity 값을 줘 움직이게 되었습니다.

하지만 MovePosition으로 변경하면 해당 문제가 고쳐친다는 말이 있어 한번 바꿔봤습니다.

1
2
3
    direction = direction * _ability.Speed;
    Vector2 moveVector = direction;
    _rigidbody.MovePosition(moveVector);

결과물입니다

Desktop View

목줄에 걸린것마냥 벗어나지를 못하는 캐릭터

현재까지 목줄에 걸린거 마냥 벗어나지 못하는 캐릭터입니다.

그래서 뭐가 문제인가 봤습니다

Vector2 moveVector = direction;해당 코드가 문제였습니다.

위치값을 0.0에서 변경을 안해줘 0.0에 묶여있던것이였습니다.

1
2
3
        direction = direction * _ability.Speed;
        Vector2 moveVector = _rigidbody.position + direction;
        _rigidbody.MovePosition(moveVector);

움직일 때마다 현재 위치값을 더해줬습니다.

결과물

Desktop View

너무 빠른 캐릭터

이번엔 캐릭터가 너무 빨랐습니다.

그래서 왜 이런가 했더니 캐릭터를 움직이는 함수는 private void FixedUpdate()에서 진행되고 있었습니다.

그로인해 한 프레임당direction을 가는 불상사가 벌어졌습니다.

1
2
3
4
    direction = direction * _ability.Speed * Time.fixedDeltaTime;
    //개빨라 뭐야
    Vector2 moveVector = _rigidbody.position + direction;
    _rigidbody.MovePosition(moveVector);

움직임에 Time.fixedDeltaTime을 곱하여 1초에 direction * _ability.Speed을 움직이게 했습니다.

결과물 Desktop View

잘 움직입니다.

본론으로 들어와 몬스터의 날아감 방지

결론으로 들어와서 보면 해당 몬스터의 Rigidbody2D컴포넌트의 Linear Drag가 플레이어와의 충돌시 받는 힘의 크기보다 낮아서 발생한 일이였습니다.

Linear Drag란 포지션 움직임에 영향을 미치는 저항계수입니다. 해당 값이 높을수록 외부에 충격에 저항합니다
참고 : 리지드바디 2D - Unity 매뉴얼

그래서 해당 값을 플레이어의 충돌량보다 높은 값을 주었습니다.

결과물 Desktop View

몬스터의 자기주장이 강력해졌습니다.

오늘의 정리

결국은 오늘은 몬스터의 날아감 방지를 위한 것보다는 플레이어를 움직이는 방법에 대한 것을 하나 더 알게 되었다.

부드럽게 같은 속도로 캐릭터를 움직이기에는 velocity보다 MovePosition로 항상 같은 값을 움직이는게 더 부드럽게 움직이게 할수 있다는 것을 알았다.

특정 장르 가속도가 붙는 장르가 아닌 일정한 속도로 플레이어또는 오브젝트를 움직일 일이 있다면 MovePosition를 쓰는 것이 조금더 유리하다는 결론을 얻었다.

Desktop View

This post is licensed under CC BY 4.0 by the author.