크기가 고정이고 꾸밈이 없으면 일반 Text 로 충분하다
Unity 에서 글자를 그리는 컴포넌트는 두 가지입니다. 예전부터 있던 Text 와, 지금 새로 만들 때 기본이 되는 TextMeshPro 입니다. 하이어라키에서 글자를 고르고 인스펙터를 보면 알 수 있습니다. Text 만 적혀 있으면 예전 것이고, TextMeshPro - Text (UI) 라고 적혀 있으면 새 쪽입니다.
한 프로젝트 안에 둘이 섞여 있는 경우가 흔합니다. 오래된 화면은 Text 로 되어 있고 새로 만든 화면은 TextMeshPro 인 식입니다. 그래서 시안을 넘기기 전에 이 화면이 어느 쪽인지 를 알면, 시안에 적어 줄 값도 달라지고 안 되는 것을 미리 걸러낼 수 있습니다.
둘은 글자를 만드는 방식부터 다릅니다
- 일반 Text 는 폰트 파일을 그대로 쓰고, 화면에 보일 픽셀 크기 그대로 글자를 폰트 텍스처에 그립니다. 크기 종류가 늘면 칸도 늘고, 텍스처가 다시 만들어질 때마다 그 폰트를 쓰는 글자를 전부 다시 그립니다
- TextMeshPro 는 글자를 가장자리까지의 거리로 미리 한 번 구워 두고, 그 한 장으로 어떤 크기든 그립니다. 외곽선과 그림자도 이 거리값으로 만듭니다
이 차이가 그대로 할 수 있는 일의 차이가 됩니다.
일반 Text 에 있는 것과 없는 것
인스펙터에서 눈여겨볼 것은 넷입니다.
- Line Spacing 은 배수입니다. 1 이 폰트가 정한 줄 높이이고, 1.5 면 한 배 반입니다. 시안의 행간 픽셀 값을 그대로 넣으면 안 되고
원하는 줄 높이 ÷ 기본 줄 높이로 바꿔 넣습니다 - Horizontal Overflow 는 줄바꿈(Wrap)과 그냥 넘치기(Overflow) 둘 중 하나입니다
- Vertical Overflow 는 잘라내기(Truncate)와 그냥 넘치기 둘 중 하나입니다. 자를 때
…을 붙여 주는 기능이 없습니다 - Best Fit 은 상자에 맞게 글자 크기를 줄여 주는 설정입니다. 최소와 최대를 정해 두면 그 사이에서 맞춥니다
없는 것도 분명합니다.
- 자간 칸이 없습니다. 글자 사이를 벌리거나 좁히는 값 자체가 없습니다
- 말줄임이 없습니다.
…이 필요하면 코드에서 직접 문자열을 잘라야 합니다 - 외곽선과 그림자는 컴포넌트를 따로 붙여서 만듭니다. 글자 정점을 복제해 겹쳐 그리는 방식이라 글자가 많을수록 부담이 그대로 늘어납니다
- 글자 안에 쓸 수 있는 꾸밈 태그도 굵게, 기울임, 크기, 색 정도입니다
폰트를 준비하는 방법도 다릅니다
- 일반 Text 는 폰트 파일의 임포트 설정에서 Character 를 Dynamic 으로 두면, 실행 중에 화면에 뜬 글자만 그 크기로 만들어 씁니다. 준비 과정이 없고 안 쓴 글자는 자리도 차지하지 않습니다. 한글처럼 글자가 많은 언어에서 이게 꽤 편합니다
- 대신 웹이나 일부 콘솔에서는 기기에 깔린 폰트를 쓸 수 없어서 폰트 데이터가 항상 빌드에 같이 들어갑니다. 여기서 아낄 수 있다고 계산하면 안 됩니다
- 글자가 없을 때 대신 쓸 폰트는 임포트 설정의 Font Names 목록으로 지정합니다
- TextMeshPro 는 쓸 글자 범위를 정해서 폰트 에셋을 한 번 굽습니다. 범위를 못 정하겠으면 실행 중에 채우는 설정도 있습니다. 굽는 값들은 TextMeshPro 는 글자를 미리 그림으로 구워 둔다에 정리해 뒀습니다
그래서 어느 쪽을 고르나
기준은 결국 세 가지입니다. 꾸밈이 있는가, 크기가 변하는가, 시안에 자간이나 말줄임이 있는가. 셋 다 아니면 일반 Text 로 그대로 둬도 화면은 잘 나옵니다. 하나라도 걸리면 TextMeshPro 쪽입니다.
실제로 이런 자리에 각각 어울립니다.
- TextMeshPro: 제목과 강조 문구, 체력이나 점수처럼 커졌다 작아지는 숫자, 외곽선이 들어간 게임 화면 글자, 자간을 맞춰야 하는 로고성 문구, 긴 이름을
…으로 줄여야 하는 목록 - 일반 Text: 크기가 고정된 설명 문구와 안내 문구, 개발 중에만 쓰는 표시, 이미 전부 Text 로 만들어져 있고 손댈 이유가 없는 옛 화면
섞어 쓰면 생기는 일
한 화면에 둘이 같이 있으면 폰트 텍스처도 두 벌 이 됩니다. 같은 폰트를 써도 일반 Text 는 픽셀 크기대로 만든 텍스처를, TextMeshPro 는 구워 둔 아틀라스를 각각 들고 있습니다. 화면을 그릴 때도 둘 사이에서 한 번 끊깁니다.
시안 값의 뜻도 달라집니다. 행간은 한쪽이 배수이고 다른 쪽은 기본 줄 높이에 더하는 값입니다. 같은 숫자를 두 화면에 넣으면 다른 결과가 나옵니다. 그래서 프로젝트 안에서 화면 단위로 한쪽으로 통일 해 두면 서로 확인할 것이 줄어듭니다.
옛 화면을 옮길 때
이미 만들어진 화면을 TextMeshPro 로 바꾸는 것은 컴포넌트만 갈아 끼우면 끝나는 일이 아닙니다.
- 행간 값을 다시 잡아야 합니다. 배수에서 더하는 값으로 기준이 바뀝니다
- 글자가 차지하는 폭이 미묘하게 달라집니다. 줄바꿈 위치가 바뀌어서 두 줄이던 문구가 세 줄이 되기도 합니다
- 폰트 에셋을 먼저 준비해야 합니다. 굽는 범위를 안 정하면 빈칸이 나옵니다
- 코드에서 그 글자를 가리키고 있으면 참조가 끊깁니다. 바꾼 뒤에 화면을 열어 확인해야 합니다
그래서 잘 돌아가는 옛 화면을 굳이 다 옮길 이유는 없습니다. 새로 만드는 화면부터 TextMeshPro 로 가고, 옛 화면은 손댈 일이 생겼을 때 같이 바꾸는 것 이 안전합니다.
시안을 넘길 때 적어 주면 좋은 것
| 항목 | 적어 줄 것 |
|---|---|
| 어느 쪽 화면인지 | 일반 Text 인지 TextMeshPro 인지, 새로 만드는 화면인지 |
| 꾸밈 | 외곽선, 그림자, 그라데이션이 있는지. 있으면 몇 종류인지 |
| 크기 변화 | 글자가 커졌다 작아지는 연출이 있는지 |
| 자간과 말줄임 | 자간 값이 있는지, 길면 … 으로 줄일지 |
| 행간 | 배수 말고 원하는 줄 높이 로 적어 주면 어느 쪽이든 계산할 수 있습니다 |
| 가장 긴 경우 | 이름, 숫자, 번역이 가장 길 때의 예시 문구 |
정리
- Unity 의 글자 컴포넌트는 예전 Text 와 TextMeshPro 둘입니다. 인스펙터 이름으로 구분합니다
- 일반 Text 는 화면 픽셀 크기 그대로 글자를 만듭니다. 그 크기를 벗어나면 흐려지고, 크기 종류가 늘면 텍스처도 늘어납니다
- 일반 Text 에는 자간과 말줄임이 없고, 행간은 더하는 값이 아니라 배수입니다. 외곽선과 그림자는 컴포넌트를 덧붙여 만듭니다
- 폰트 준비는 반대입니다. 일반 Text 는 실행 중에 필요한 글자만 만들고, TextMeshPro 는 범위를 정해 미리 굽습니다
- 꾸밈이 있거나, 크기가 변하거나, 자간과 말줄임이 필요하면 TextMeshPro 입니다. 셋 다 아니면 일반 Text 로도 충분합니다
- 한 화면 안에서는 한쪽으로 통일하는 편이 낫습니다. 텍스처도 값의 뜻도 두 벌이 되기 때문입니다