Game/Unity

[유니티] 한글 폰트 깨짐 with Text Mesh Pro

nowkoes 2023. 6. 18. 19:52

개요

 

 유니티로 게임 개발을 진행하던 중, 한글 문자가 깨져서 사각형으로 나타나는 문제를 발견하였다. 이 현상은 주로 폰트가 한글을 지원하지 않거나, 파일의 인코딩이 잘못된 경우에 발생하는데, 이제부터 이 문제를 해결하는 방법에 대해 살펴보겠다.


폰트 다운

 유니티에서 기본적으로 사용하는 LiberationSans 폰트는 기본적으로 한글을 지원하지 않는다. 특정 폰트가 한글을 지원하지 않을 때, 이를 직접 바꾸는 것은 불가능하다. 따라서 다른 한글을 지원하는 폰트를 찾아서 다운로드하여야 한다. 새로운 폰트는 에셋 스토어 혹은 구글링 등을 통해 다운로드하면 된다.

 

출처: https://maplestory.nexon.com/Media/Font

 

 필자의 경우 넥슨의 메이플스토리 서체와 TextMesh Pro를 기준으로 진행하겠다. 해당 사이트의 TTF 파일을 다운로드하여 폰트 작업이 필요한 유니티 에셋에 옮긴다. 필자의 경우 Assets → TextMesh Pro → Fonts 폴더에 옮겼다. 만약 이 과정에서 TMP 폴더가 없으면, TMP Essentials을 패키지 매니저에서 임포트 해주자. 

 

패키지 매니저에서 TMP를 임포트한 후, 작업을 완료한 모습


폰트 생성과 TMP를 쓰는 이유 

 

 막상 폰트를 적용하려고 하면, 위의 사진처럼 다운로드한 폰트를 불러올 수가 없을 것이다. 이에 대한 이유를 설명하기 앞서 TMP를 사용하는 이유부터 알아보자.

 

출처: https://docs.unity3d.com/kr/2021.3/Manual/com.unity.textmeshpro.html

 

 TextMesh Pro유니티의 기본 텍스트 컴포넌트보다 뛰어난 품질과 성능을 제공하는 도구다. 이는 위의 Unity 공식 문서에서도 명시되어 있다. 무엇보다도, TMP의 중요한 특징 중 하나는 SDF(Signed Distance Field) 렌더링 방식을 사용한다는 것이다. 이 기법은 텍스트의 크기나 회전이 변경되었을 때도 텍스트의 선명도를 최대한 유지한다. 이는 게임 개발에서 매우 중요한 점으로, 게임의 확대, 축소, 회전 등의 동적인 변화에 따라 텍스트의 품질이 일관되게 유지해 준다.

 

 또한 고급 렌더링 기술과 커스텀 셰이더를 활용하여 화려한 텍스트 효과를 생성하고, 뛰어난 성능을 제공한다. 이러한 기능은 게임에서 텍스트의 가독성을 향상하고, 사용자 경험을 풍부하게 만드는 데 큰 역할은 한다.

 

 하지만, TMP는 기본적으로 ttf 파일과 otf 파일을 직접적으로 사용하지 못한다는 단점이 있다. 따라서 이러한 파일을 TMP가 지원하는 폰트 자산으로 변환해야 한다. 이를 통해 다운로드한 폰트를 TMP 전용 폰트로 만들어야 한다는 것을 알았으니, 직접 변환해 보도록 하자.

 

 

 Unity → Window → TextMeshPro → Font Asset Creator를 눌러 폰트 에셋 관리자 창을 열어준다.

 

 

 그러면 다음과 같은 폰트 에셋 관리자 창이 뜰 것이다. 여기서 각 설정들에 대해 설명하자면 다음과 같다.

 

  • Source Font File: 변환할 폰트 파일
  • Sampling Point Size: 폰트의 기본 크기 설정. 이 크기는 Atlas에 렌더링 되는 글자의 실제 픽셀 크기에 영향을 미치므로, 적절한 스케일링을 통해 메모리 사용량을 보존
  • Padding: 각 글자 주변에 추가되는 여백을 결정. 이 여백은 서로 다른 글자들 사이의 공간을 둘 때 유용하며, 텍스트의 가독성을 향상함
  • Atlas Resolution: 생성되는 폰트 아틀라스의 해상도를 결정. 해상도가 높을수록 텍스트의 품질이 높아지지만, 메모리 사용량이 증가함
  • Character Set: ASCII, Unicode 등 생성할 글자 집합을 결정. 참고로 ASCII 코드는 기본적으로 한글을 지원하지 않지만, 해당 창에서 ASCII를 선택하더라도 실제로 유니코드 문자를 지원하기 때문에 한글을 사용할 수 있음
  • Render Mode: 텍스트가 SDF, Raster 등 렌더링 되는 방식을 결정
  • Get Kerning Pairs: 폰트의 글자 쌍 사이의 간격을 조정시키는 정보를 가져올 것인지 결정

 

 여기서 Atlas란 컴퓨터 그래픽스에서 사용하는 용어로써, 여러 이미지 또는 텍스처를 하나의 큰 이미지로 결합한 것을 의미한다. 이는 그래픽 카드의 메모리 사용량을 줄이고 렌더링 성능을 향상하는 효과가 있는데, TMP에서는 텍스처 대신에 폰트의 모든 글자들을 하나의 큰 이미지에 합쳤다고 생각하면 된다.

 

출처: https://www.afternow.io/wanna-reduce-the-build-size-of-your-unity-mobile-app-up-to-70/

 

 우리가 조정할 것은 Atlas Resolution이다. 위의 사진에서 알 수 있듯이, 각 해상도마다 사용하는 메모리가 달라지므로 프로젝트의 요구사항과 타깃 플랫폼의 제한사항을 충분히 고려하여 설정해야 하지만, 일반적으로 현재 대부분의 그래픽 카드에서 지원하는 최대 텍스처 해상도인 4096 * 4096을 많이 쓴다.

 

 

 폰트 아틀라스를 생성하면 다음과 같은 화면이 뜰 건데, Save를 눌러서 TextMesh Pro → Fonts 폴더에 저장하자.

 

 

 그리고 생성된 <폰트이름 SDF>의 인스펙터 창에서 Atlas Population Mode를 Dynamic으로 바꿔주고, 샘플링 사이즈를 60 정도로 설정하자. 이 사이즈는 추후에 본인의 프로젝트 상황에 맞게 바꿔줘도 된다. 이때 Population Mode폰트 아틀라스를 어떻게 생성하고 관리할 것인지를 결정하는 설정이다. Static 모드를 고른다면,  Font Asset Creator를 사용하여 처음 생성될 때 정의된 모든 글자를 포함한다. 이 모드는 글자 세트가 미리 알려져 있고 변경되지 않는 경우에 적합하다. 이 모드에서는 게임 실행 중에 새로운 글자를 아틀라스에 추가할 수 없다.

 

 반대로 Dynamic 모드를 설정한다면, 폰트 아틀라스는 필요에 따라 게임 실행 중에 동적으로 업데이트된다. 즉, 처음에는 아틀라스가 비어 있거나 일부만 채워져 있을 수 있고, 새로운 글자가 필요하게 될 때마다 그 글자를 아틀라스에 추가한다. 이 모드는 사용자가 입력한 텍스트를 표시해야 하거나, 런타임에 동적으로 변경되는 텍스트를 다루는 경우에 유용하다.

 

 

 이제 설정을 끝마치고 씬에 돌아와 텍스틀 확인해 보면 한글이 깨지지 않는 것을 확인할 수 있다.


요약

TMP
1. 정의: 유니티에서 제공하는 텍스트 렌더링 솔루션
2. 특징
 a. 기본적인 레거시 텍스트 컴포넌트보다 뛰어난 성능과 다양한 효과 제공
 b. 폰트 에셋을 사용하기 전, 별도의 변환 과정이 필요
3. 과정
 a. 원하는 폰트 파일을 유니티 프로젝트 폴더에 추가
 b. Font Asset Aditor를 통해 ttf 혹은 otf 파일을 asset으로 변환 
 c. 변환된 폰트 에셋에 대해 필요한 설정(Population Mode, Font size 등)을 조정
반응형