유니티 큰 숫자 a, b, c 로 표기하기 #10000 = 10a, 10000a = 10b

게임을 제작하다 보면 재화의 수치가 급격하게 커져서 100,000 / 1,000,000 이런식으로 표기하는게 점점 어려워 집니다.

위와 같이 수를 그냥 나열하는 방식이라면 1억이라는 데미지를 어떻게 표현할까요...(메이플에선 그냥 표기하기도 하던데 저는,,, 1억 5천만! 이런식으로 보여지는게 편하더라고요)

 

그래서 대다수의 게임은 큰 수의 경우 수를 알파벳으로 치환해서 표기하곤 합니다.

예를 들어 10,000 이라는 수치는 10a로 표기하거나, 10,000a 라는 수치는 10b 이런식으로 치환해서 사용하곤 합니다.

 

위와 같은 방식의 장점은 수가 커져도 어느정도 커버가 가능하다는 것이며, 알파벳이 높아질 수록 사용자는 더 쎄지는 기분을 직관적으로 받을 수 있습니다.


표기되는 모습

수치를 a,b로 표기하는 모습

 

저는 소수점 셋 째 자리까지 표기하도록 만들었습니다. 그리고 1000을 기준으로 알파벳을 치환하게 끔 만들었습니다.


코드 및 사용 방법

public static class CurrencyUtil
{
	private const long ConversionRate = 1000;
	private static readonly string[] Units = { "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };

	public static string ConvertCurrency(double amount)
	{
		int unitIndex = 0;

		while (amount >= ConversionRate && unitIndex < Units.Length - 1)
		{
			amount /= ConversionRate;
			unitIndex++;
		}

		// 셋 째 자리까지만 표기
		string formattedAmount = $"{amount:F3}";

		// 소수점 끝이 0이라면 안보이게
		formattedAmount = formattedAmount.TrimEnd('0').TrimEnd('.');

		// 값이 처리 후 비어 있다면, 그 값을 '0'으로 설정합니다.
		if (string.IsNullOrEmpty(formattedAmount))
		{
			formattedAmount = "0";
		}

		return $"{formattedAmount}{Units[unitIndex]}";
	}
}

 

해당 함수는 Util함수로 어디서나 호출가능하게 만들어주었습니다.

private string GetUpgradeCost(int currentIndex, List<int> upgradeList)
{
        if (currentIndex >= upgradeList.Count)
        {
            return "Max";
        }

        int index = Mathf.Clamp(currentIndex - 1, 0, upgradeList.Count - 1);
        return CurrencyUtil.ConvertCurrency(upgradeList[index]);
   }

 

비용이 변하는 버튼에 CurrencyUtil 함수를 이용해서 수치를 치환하게 끔 만들었습니다.

로직의 경우 이해할 필요 없고 어떤 식으로 사용하는지만 이해하면 될 것 같습니다.