[2025_11_27]BigInteger기반의 NumberFormatting

2025. 11. 28. 06:07TIL

배경

클리커/방치형 게임에서는 게임 진행에 따라 재화(골드, 가격 등)가 기하급수적으로 증가한다. 따라서 일반적인 자료형(int, long)의 범위를 초과하는 매우 큰 수를 다룰 필요가 있다.

구현 목표

  • 사실상 무한대의 수를 표현하기 위해 BigInteger 사용
  • 큰 숫자를 K, M, B, T, aa, ab... 형식으로 변환하는 NumberFormatter 구현
  • 1000 단위로 나누어 가독성 있게 표시

문제 발생

문제:

 
csharp
public BigInteger rewardGold;  // Inspector에 노출 안 됨, 항상 0

EnemySO에서 골드 보상을 BigInteger 타입으로 선언했더니:

  • Inspector에 필드가 표시되지 않음
  • 기본값이 0으로 설정되어 몬스터 처치 시 골드 획득 불가

원인:
Unity는 BigInteger를 직렬화(Serialize)할 수 없어 Inspector에서 값을 설정할 수 없다.

해결 방법

해결:

 
 
csharp
[SerializeField] private string goldRewardString = "10";  // string은 직렬화 가능

public BigInteger GoldReward 
{
    get
    {
        if (BigInteger.TryParse(goldRewardString, out BigInteger result))
            return result;
        return 0;
    }
}
  1. string 타입으로 값을 저장 (Unity 직렬화 가능)
  2. 프로퍼티를 통해 런타임에 BigInteger로 변환
  3. Inspector에서 문자열로 값 입력 가능 ("1000000000" 등)

배운 점

  • Unity는 [Serializable] 속성이 있거나 기본 타입만 직렬화 가능
  • BigInteger는 Unity가 직렬화할 수 없는 타입
  • 직렬화 불가능한 타입은 string 변환 또는 래퍼 클래스를 활용하여 해결 가능
  • 실무에서는 데이터 타입 선택 시 Unity 직렬화 여부를 고려해야 함