오늘은 유저 테스트 시작 전에 마무리를 했다.
해당 문제는 스테이지별로 아이템 가격을 상승시키기 위해 아이템 가격에 1.1배를 곱해서 발생한 문제였다.
정확하게는, 아이템 가격에 1.1을 곱하였기 때문에 int형에서 float로 암시적 형변환이 이루어졌는데, 이를 계산하기 위해 Mathf.FloorToInt() 메서드를 사용하여 소수점을 버림 계산을 했었다. 다만, 상점에서 아이템 가격을 출력할 때는 단순히 소수점을 버려도 되었지만, 구매 시 플레이어 골드에서 가격을 차감할 때는 소수점이 있는 채로 계산을 한뒤, 남은 플레이어 골드를 버림 계산을 통해 int로 변환을 했기 때문에 발생한 문제였다.
ex) 아이템 가격이 20.5원인 경우. 그리고 플레이어 소지금이 100 골드라고 가정하자.
상점 표시 가격 -> 20원
구매 시 -> 100 - 20.5 = 79.5 -> 79원
따라서 표기된 금액보다 1원이 더 나가는 문제가 발생했었다.
이는 휴먼 에러로, 내가 코드를 잘못 작성해서 발생한 문제였다.
Mathf.FloorToInt(player.Data.Gold - (selectedItem.itemSO.Price + 1.1f * currentStage))
원래는 위와 같이 코드를 작성했었다. 이 경우, 플레이어 골드에 소수점이 생기고, 이를 버리다보니 표기된 금액보다 1원이 더 나가게 되었다.
player.Data.Gold - Mathf.FloorToInt(selectedItem.itemSO.Price + 1.1f * currentStage)
따라서 위와 같이 코드를 수정했더니 문제를 해결할 수 있었다.
이 문제는 해결을 하는데 너무 힘들었다...
인벤토리에서 무게만큼 플레이어의 최대 체력이 깎인 후, 스테이지를 시작할 때는 체력이 제대로 반영이 되지만, 몬스터를 한 마리 죽인 후, 몬스터에게 맞으면 체력이 갑자기 +2가 되는 문제가 발생했다.
문제의 원인은 Player의 PlayerBaseData의 데이터가 Init이 되지 않아서 초기값으로 지정되어 있었던 것이 문제였다. 따라서 플레이어의 레벨 업에 필요한 MaxEXP 값이 0으로 설정이 되어 있었고, 그래서 몬스터를 한 마리 잡으면 바로 레벨 업이 되어 체력이 올랐던 것이었다.
따라서 문제는 플레이어의 Awake()에서 Data를 Init하도록 코드를 수정했다.
위의 문제는 이렇게 말만 하면 되게 쉬운 문제인 것 같지만... 어떤 것이 문제였는지 파악하는 데 장장 6시간이 소요되었다. 왜냐하면 레벨 업으로 인해 더해진 체력 +2가 절묘하게 플레이어의 기본 최대 체력과 같았기 때문이었다. 따라서 나는 이 문제를 아이템 무게에 따른 디메리트로 플레이어의 최대 체력을 깎았지만, 몬스터에게 한 대 맞으면 갑자기 최대 체력이 원상복구가 되는 문제로 생각하고 해결하려 했었다. 정말 온갖 난리를 다 쳐서 최대 체력 세팅이 되는 것이 몬스터에게 맞기 전이라는 것을 확인하고, 몬스터 한 마리를 잡으면 바로 레벨 업이 되는 상황을 파악한 시간이 12시 반이었다. 그래도 문제를 해결해서 다행이다.