오늘은 최종 프로젝트 발표 전 2차 유저 테스트를 시작했다.
우리가 1차 유저 테스트를 진행하면서 받았던 개선 사항들을 수정해서, 얼마나 게임이 나아졌는 지에 대한 피드백을 받아보기 위해 진행을 했다. 2차 유저 테스트 결과와 1차 유저 테스트의 결과를 비교하며 우리가 얼마나 개선을 했는지 보여주는 지표로 삼을 예정이다.
요 몇일간 나의 골머리를 앓게 했던 문제였다. 우리 게임에는 플레이어가 소유한 아이템의 무게만큼 디메리트로 체력과 이동 속도를 감소 시키는 기믹이 있다. 이 때, 이동 속도가 적용이 될 때, 플레이어의 현재 스탯 중 이동속도와 변경되는 스탯을 계산하여 진행을 했다.
moveSpeed = baseStat.moveSpeed + (baseStat.moveSpeed * modifider.moveSpeed / 10);
위와 같은 식을 통해, 현재 플레이어의 스탯인 baseStat과, 변경시킬 스탯인 modifier 스탯을 곱하고 나누어 계산을 했었다.
이 때, 아이템을 인벤토리에서 뺄 때와 더할 때의 플레이어의 현재 스탯의 차이로 인해 오차가 발생을 했고, 계속해서 값이 이상하게 적용이 되었다.
아이템을 빼기 전에는 4.5였다가, 아이템을 빼서 무게가 가벼워지니, 가벼워진만큼 디메리트가 줄어서 이동속도가 4.95까지 오르는 것을 확인할 수 있다.
이 때, 아이템을 빼기 전에는 baseStat.moveSpeed가 4.5였기 때문에, 위의 식을 통해 계산을 해서 4.95가 될 수 있었다.
하지만, 다시 아이템을 인벤토리로 넣을 때, baseStat.moveSpeed가 4.95인 상태이기 때문에, 4.95 * modifier.moveSpeed를 통해 값을 계산을 하게 되기 때문에 처음과 다른 값이 나오게 된 것이다.
이를 해결하는 방법은 결국 이동 속도를 조절할 때 플레이어의 현재 이동 속도가 아니라, 플레이어의 기본으로 설정되어 있는 이동 속도의 초기값을 가지고 계산을 하는 것으로 변경을 했다.
예를 들어, 플레이어의 기본 이동 속도가 현재 5로 설정되어 있는데, 아이템을 뺄 때도 5를 기준으로 계산을 하고, 아이템을 더할 때도 5를 기준으로 계산을 하면 아이템을 넣었다 빼도 값이 일관되게 유지될 수 있다.
if (isPlayer)
{
float playerSpeed = GameManager.Instance.Player.Data.moveSpeed;
if (speed <= 0)
moveSpeed = baseStat.moveSpeed + (Mathf.Floor(playerSpeed * speed * 10) / 10);
else moveSpeed = baseStat.moveSpeed + (Mathf.Ceil(playerSpeed * speed * 10) / 10);
}
거기에다가, float 연산으로 인해 발생하게 되는 소수점 값들로 인한 값의 오차를 줄이기 위해 Floor와 Ceil을 통해 내림, 올림 처리를 해주었다.
오늘은 어쨌거나 8주간 힘내서 달려온 최종 프로젝트를 거의 마무리를 지었다. 시간이 부족해서 마저 구현하지 못한 것들이 있어 아쉽기는 하지만, 그래도 최대한 최적화도 잘해보려 노력을 했고, 버그도 정말 열심히 잡은 결과물이 나온 것 같아 매우 뿌듯하다.
이제 발표만 잘해서 유종의 미를 거둘 수 있으면 좋겠다.