Unity TextMeshPro 스케일 애니메이션 시 폰트 깨짐 현상

Unity에서 UI 애니메이션을 구현하다 보면 TextMeshPro(TMP) 텍스트가 포함된 오브젝트의 스케일을 애니메이션할 때 예상치 못한 문제가 발생합니다. 특히 DOTween이나 애니메이션 시스템을 사용해 스케일을 0에서 1로 변경하거나 작은 크기에서 큰 크기로 키울 때, 텍스트가 박스 형태로 나오거나 흐릿하게 표시되는 현상이 나타납니다.

문제 원인

이 현상은 TMP_Text 컴포넌트가 활성화될 때 현재 스케일 기준으로 폰트 아틀라스를 생성하기 때문에 발생합니다. 텍스트가 작은 크기로 초기화된 후 부모 오브젝트의 스케일이 커져도 TMP가 자동으로 폰트 텍스처를 재생성하지 않아, 작은 해상도의 폰트가 확대되면서 품질 저하가 발생합니다.

예를 들어:

  • 컨테이너의 스케일이 0.1일 때 TMP가 활성화되면 작은 크기의 폰트 텍스처 생성
  • 컨테이너가 스케일 1로 애니메이션되면 텍스트도 10배 확대
  • 이미 생성된 작은 폰트 텍스처가 늘어나면서 박스 형태 또는 흐림 현상 발생

임시 해결 방법

완벽한 해결 방법은 아직 찾지 못했지만, 다음과 같은 임시 처방으로 문제를 우회할 수 있습니다:

텍스트에 직접 스케일 애니메이션 적용: 컨테이너에 스케일 애니메이션이 들어갈 때, 내부에 있는 TMP_Text 오브젝트에도 동일한 스케일 애니메이션을 적용합니다. 이렇게 하면 텍스트가 스케일 변화를 감지하고 폰트를 갱신하게 됩니다.

// 예시: DOTween 사용 시
container.DOScale(1f, 0.5f);
tmpText.transform.DOScale(1f, 0.5f); // 텍스트에도 동일하게 적용

// 혹은
container.DOScale(1f, 0.5f);
var sd = rt.sizeDelta;
rt.sizeDelta = Vector2.zero;
DOTween.To(() => rt.sizeDelta, x => rt.sizeDelta = x, sd, 0.5f);

이 방법은 TMP가 자체 transform의 스케일 변화를 감지하여 폰트 렌더링을 갱신하도록 유도하는 방식입니다.

추가 고려사항

  • 텍스트가 여러 개 있는 경우 모든 TMP_Text에 애니메이션을 적용해야 함
  • 성능상 오버헤드가 있을 수 있으므로 대량의 텍스트가 있는 경우 주의 필요
  • Auto Size 기능을 사용하는 경우 다른 방식의 해결책이 필요할 수 있음

더 나은 해결 방법을 찾게 되면 업데이트하겠습니다.

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *