유니티 한글 폰트 - yuniti hangeul ponteu

<2020-03-03 수정됨>

- 본문 맨 아래 간단하고 쉬운 폰트 생성 법에 대한 내용이 추가되었습니다 -

(급하신 분들은 맨 아래 내용만 보셔도 상관없습니다!)

<2021-04-22 추가>

한글만 더 간단하게 넣는법 + 머티리얼프리셋 설정법

+ 기존의 text를 버리고 tmp를 써야하는 이유 추가됨

유니티에서 제공하는 UI의 텍스트에는 2가지 종류가 있다.

1. 기존 UGUI의 Text와

2. 원래는 에셋 스토어 상품이었던 TextMeshPro(지금은 유니티에서 제공)

기존 텍스트에 비해서 커스터마이징도 가능하며 메모리 소모도 적은 TextmeshPro 사용을 더 권장하지만

단점이 있다면 사용 과정이 너무 복잡하다.

최근 유니티에서 제공하는 예제들을 보면 대부분 TextmeshPro를 사용하던데

한글 사용에 대한 공식 문서는 뭐 보이지도 않고

일반 사용자의 블로그나 유튜브에 한두 개 정도 있으며 그마저도 옛날 글이라

지금 버전의 Textmeshpro와 UI가 다소 차이가 있다.

그래서 간단하게나마 정리해두려 한다.

먼저 필요한 건 한글로 만들 수 있는 문자를 TXT로 정리해둔 데이터가 필요하다.

왜 필요하냐면 사용하고자 하는 폰트를 가져와서 원하는 글자만

TextmeshPro 에셋으로 전환해 주는 기능을 이용하기 위해서이다.

실제 한글은 1만 자가 넘어가는데 보통 일상에서 쓰는 문자는

2000개 정도 되므로 그 정도만 있어도 사실상 크게 불편한 점은 없었다.

(위의 블로그에서 제공하는 파일을 다운로드해서 사용하였다.)

자 이제 본격적으로 TMP(TextMeshPro)에셋을 만들어보자.

먼저 패키지 매니저에서 TMP를 설치한다.

Window - TextMeshPro - Font Asset Creator를 통해 Font Asset Creator 창을 열어보자

여기서 중요한 건 위 4가지이다.

(이때 2번, 3번이 보이지 않는다고 당황하지 말고 아래를 계속해서 읽어보자)

1번 CharacterSet을 "커스텀 캐릭터"로 선택하면.

원래의 ASCII가 선택되어 있을 때랑 UI가 살짝 달라질 것이다.

(2, 3번이 생긴다.)

2번을 보면 마치 어떤 파일을 무조건 넣어야 될 것 같이 생겼는데 다행히도 그렇지 않다.

이건 진짜 UI 디자인 한 사람이 무슨 생각을 가지고 이렇게 헷갈리게 만들었는지 모르겠는데

늦게라도 이 부분은 UI/UX가 반드시 수정되어야만 할 것 같다.

이제 3번에 아까 다운로드한 파일을 열어서 텍스트를 복사하고 붙여 넣자.

나머지는 파일 사이즈, 해상도 등에 관한 내용이라 필요에 따라 정하도록 하자.

참고로 아까 2번에서 옵션을 정한 것 중에 파일을 넣는 것도 있는데

그건 또 안되는 경우가 너무 많아서 그냥 이 방법을 추천한다.

아무튼 내용을 복사해서 붙여 넣었다면

생각보다 시간이 좀 걸리니 여유를 가지고 기다리면

여기서부턴 필요한 사람들을 위한 추가 설명이다.

Sampling Point Size는 한 글자당 차지할 이미지 크기이다.

총 이미지 크기는 Atlas Resolution에서 정해주는데 위 사진에는 2048x2048픽셀짜리 이미지에

한 글자당 50픽셀을 넣어주겠다는 얘기다.

만약 커스텀 사이즈가 아니라 오토 사이즈를 선택했다면

설정한 이미지 크기를 글자 수만큼 거의 n 등분한 값이 각각의 텍스트 크기로 정해진다.

이를테면 이런 식으로 말이다.

Packing Method는 빠르게 만들 것인지,

(이 방식을 추천하지만 중복된 글자가 패키징 됨)

그냥 좀 걸리더라도 최적화할 것인지이다.

(최적화의 경우 기존에 존재하는 다른SDF파일을 참조해서 중복된 글자를 제외하는 듯)

두 개밖에 없으니 따로 더 설명은 하지 않겠다.

다음으로 넘어가서 Render Mode에는 몇 가지 종류가 있는데

각각 아래와 같다.

1. Smoorh_Hinted - 힌팅, 안티 앨리어싱이 된 글꼴 렌더링.

(문자가 커지거나 작아져도 라인이 부드럽게 연결)

2. Smoorh - 힌팅없이 안티 앨리어싱된 글꼴 렌더링.

(동적으로 사용할 때 렌더링이 가장 빠른 모드)

3. Raster_Hinted - 힌팅만하고 안티앨리어싱이 안된 글꼴 렌더링.

(가장 선명한 글꼴 렌더링 옵션이며, 픽셀 표현에 유리)

4. Raster - 힌팅도 안티앨리어싱도 안된 글꼴 렌더링.

(그냥 원래 폰트 처음 그대로 출력)

5. SDF(Signed distance field) - 위의 비트맵 방식과는 다르게

거리에 따라 선명도를 계산하여 보여주는 방식.

셰이더를 통해 아웃라인등을 구현하여 꾸밀 수 있다는 장점이 있다.

작은 글자는 오히려 잘 안보이고,

비트맵처럼 전체 문자를 전부 바꾸면 용량이 커진다는 단점이 있어서

필요한 문장을 추가해나가는 것을 추천한다.

(수시로 보이는 거리가 달라지거나 셰이더를 이용해서 아웃라인이나 질감 표현 등을 하는 타이틀 제목,

3D 게임 내 표지판, 간판 등에 어울림. )

* 안티 앨리어싱 - 계단현상(선이어야 하는 게 픽셀 때문에 계단처럼 보이는 현상) 개선하는 기술.

* 힌팅 - 글자 크기가 변하더라도 힌트를 참고하여 모양을 약간 변화시켜 글자를 뚜렷하게 보이도록 하는 기술.

<참고>

http://digitalnativestudios.com/forum/index.php?topic=890.0

마지막으로 Get Kerning Pairs는 특정 문자 간 거리를 조정하여 최적화해주는 기능인데

대부분의 폰트에는 잘 없다고 하긴 하지만 나는 혹시 몰라서 켜두긴 한다.

<2021-04-22 추가>

Character Set를 Custom Range로 선택하고

44032-55203를 입력하면 한글이 모두 적용된다.

또 하나의 TMP에셋을 이용해서 material preset만 바꾸는 방식으로

아웃라인 전용, 그림자효과 전용 등등 원하는 형태로 다르게 사용이 가능하므로

쓸데없이 같은 폰트를 여러개 만들어서 사용하는 일은 없길 바란다.

방법은 아래와 같다.

1. 눈으로 보면서 프리셋형태로 바꾸기 편하게 TMP오브젝트를 하나 만들어준다.

2. 인스펙터창에서 폰트에셋의 아랫쪽을 보면 머티리얼부분이 있다.

원하는 느낌이 날때까지 꾸며본다.

3. 오른쪽 위에 점세개를 누르고 Create Material Preset을 눌러준다.

4. 파일이 생성되면 위치를 폰트에셋과 같은곳으로 옮겨준다.

5. 마지막으로 파일이름을 "폰트에셋이름 + 마음대로"해주면 자동으로 적용이 된다.

참고로 폰트이름은 "BlackHanSans 1K SH"이고 "- RED"는 내가 마음대로 지은 이름이다.

6. 이름까지 바꾸면 이렇게 적용이 가능해지는것을 확인 할수가 있다.

1. Font Asset Creator에서 Padding 값을 높여본다.

위 사진처럼 Padding 값이 너무 작으면 아웃라인이 그려질 공간이 없어서 조금만 그려진다.

사실 아웃라인보다 바로 옆에 있는 글자도 같이 출력되는 문제도 있어서 적절히 높여주는 게 좋다.

2. Render Mode

SDF 이외의 것들은 꾸미는데 부적합한 모드이다.

(각 모드의 특징은 본문을 참고해주세요.)

Smooth_Hintesd를 SDF로 바꿔주기만 해도 아웃라인이 크게 크게 잘 나온다.

3. Shader 바꿔보기

이렇게 되어있다면 Distance Field로 바꿔주자.

참고로 꾸미지 않고

Smooth_Hintesd처럼 비트맵 방식을 사용하는 경우 그대로 Bitmap을 사용하자.

4. mobile이라면 mobile Shader를 사용하자.

빌드 타겟이 안드로이드나 IOS라면 모바일 셰이더를 사용하자.

성능도 성능인데 모바일 셰이더가 아니면 제대로 안 나오는 경우도 있다.

폰트 우 클릭 Create - Textmeshpro - FontAsset 클릭

인스펙터 창의 Generation Settings 부분에서 폰트 설정 가능

특히 Atlas Population 모드를 Dynamic으로 하면

폰트 적용 후 내용 입력할 때마다 동시에 이미지로 생성됨

이미지 생성 안됨 -> SDF 같은 용도는 입력 후 Static으로 변경하는 것을 추천

왜냐하면 썼다 지워도 이미 생성된 이미지는 그대로 남아 있기 때문

이게 싫으면 그냥 기존 방식을 사용해 수동으로 만들면 됨.

그 외에도 Render 모드나 이미지 크기 등을 설정할 수 있으니 필요에 따라 설정하면 됨.

※한 줄 정리

: 용량에 엄청나게 민감한 환경(KB 단위)이 아니라면 이 방법으로 사용하도록 하자!

- 댓글을 통해 정보를 공유해 주신 "컵라면"님께 진심으로 감사드립니다. -

<2021-04-22 추가>

기존의 UGUI Text대신 TMP를 사용해야하는 이유?

기존의 text는 용량이 2Mb정도로 적은 용량이라는 이점이 있지만

성능에 생각보다 매우 큰 영향을 미침

반면 TMP는 2K기준 20Mb정도로 10배이상 큰 용량을 가지지만

매우매우 빠르며 메모리를 오히려 덜 사용해 최적화에 매우 유리

요즘은 게임의 경우 APP자체가 Gb단위로 나오는 경우가 허다하므로

옛날만큼 용량에 신경쓰지 않아도 된다는게 개인적인 의견이다.

그래도 불안하다면 CDN을 통해 따로 내려받기를 하는 방법도 있다.

또 기존 text시스템은 불가능한 퀄리티높은 꾸미기 기능을 제공하기 때문에

가능하면 text보다는 TMP 사용을 추천하는 바이다.