서론: 에셋을 구매하다.
에셋스토어에서 에셋 번들을 구매하게 되었다. 사실상 거의 단 하나의 에셋만 보고 구매했다.
그 에셋이 바로 Damage Numbers Pro 다.
마침 진행하는 프로젝트에서 전투 메커니즘을 구현하는 중이었고, 데미지 숫자가 나타나게 하는 것은 어렵지는 않지만 매우 번거로운 일이기 때문에 고민하지 않고 구매했다.
문제 상황: 치명적인 버그를 발견하다.
숫자가 깨진다.
문제상황 분석과 이전 버그 리포트 리서치
우선, 이 버그 상황에 대해, 개발자의 디스코드 채널에 들어가 찾아보았다.
수년전에 몇번, 몇달전에 한번 비슷한 버그 리포트가 올라왔었으나, 결국 개발자가 동일 증상을 재현하지 못하면서 흐지부지 끝나버렸었다.
내가 직접 이 버그를 해결해야만 했다.
발생 조건 분석:
우선 이 증상이 나타나는 조건에 대해 분석해야했다.
유니티 버전은 수년전에도 같은 증상이 일어났던 보고가 있기 때문에 제외하고,
HDRP 의 문제인가 싶어서 이에 대해서도 살펴보고, Post processing과의 충돌인가 싶어서, 이에 대해서도 분석해 보았다.
다양한 조합을 시도해 본 끝에, 두 시간 정도만에 발생 조건을 찾을 수 있었다.
- pooling 옵션을 사용.
- pooling을 위해 prewarm을 해야 함.
- 3D 월드 상에 데미지 숫자 오브젝트 존재 (2D 캔버스를 이용하는 방식 말고)
- 다른 오브젝트에 의해 데미지 숫자가 가려지지 않도록 하는 옵션 켜기. (그 중에서 쉐이더를 사용하는 방식 말고, 물리적으로 오브젝트를 카메라쪽으로 이동시키는 방식을 사용)
- pool에서 처음 enable될 때만 문제 발생.
문제 부분 발견
문제의 핵심은 prewarm 시에 instantiate 되는 위치에 있었다.
라이브러리 내부를 코드를 보면, -9999, -9999, -9999 라는 위치로 Instantiate를 했었고,
DamageNumber dn = Spawn(new Vector3(-9999, -9999, -9999));
발생조건 4번의 옵션에서 pool에서 오브젝트를 가져올때, 기존의 위치에서 한번 enable한 후, 바로 지정한 위치로 이동되는 방식이었다. 이것이 문제였다.
너무 극단적으로 먼 위치에서 enable되었기 때문에 LOD에 의해 글자를 알아볼 수 없을정도로 디테일이 사라진 것이었다.
이 부분을 수정했더니 데미지가 제대로 표시되었다.
버그 리포트
내가 알아낸 부분을 정리해서 디스코드를 통해 개발자에게 연락을 했더니, 개발자가 버그 재현에 성공했고 버그를 수정한 새로운 버전을 배포했다고 연락이왔다.
그리고 DM을 통해 따로 연락이 와 자신이 판매하는 다른 에셋을 선물로 주고 싶다고 연락이 왔다.
나는 이 분의 성의를 무시할 수 없다고 생각해 바로 가장 비싼 에셋을 골라 받았다.