[2025_11_27]BigInteger기반의 NumberFormatting
2025. 11. 28. 06:07ㆍTIL
배경
클리커/방치형 게임에서는 게임 진행에 따라 재화(골드, 가격 등)가 기하급수적으로 증가한다. 따라서 일반적인 자료형(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;
}
}
- string 타입으로 값을 저장 (Unity 직렬화 가능)
- 프로퍼티를 통해 런타임에 BigInteger로 변환
- Inspector에서 문자열로 값 입력 가능 ("1000000000" 등)
배운 점
- Unity는 [Serializable] 속성이 있거나 기본 타입만 직렬화 가능
- BigInteger는 Unity가 직렬화할 수 없는 타입
- 직렬화 불가능한 타입은 string 변환 또는 래퍼 클래스를 활용하여 해결 가능
- 실무에서는 데이터 타입 선택 시 Unity 직렬화 여부를 고려해야 함
'TIL' 카테고리의 다른 글
| [2025_12_01]기획 문서의 해석 (0) | 2025.12.01 |
|---|---|
| [2025_11_28]기획자와의 협업 프로젝트 (0) | 2025.11.28 |
| [2025_11_26]기획자와 협업할 때 데이터 관리에 대한 고민 (0) | 2025.11.26 |
| [2025_11_25]직선 거리 기반 타겟팅의 한계와 길찾기 알고리즘의 필요성 (0) | 2025.11.25 |
| [2025_11_24]유니티 Batching을 이용한 최적화 및 Addressble (0) | 2025.11.25 |