---
title: "TextMeshPro 는 글자를 미리 그림으로 구워 둔다"
description: "한글은 영문과 글자 수부터 다릅니다. 폰트 에셋이 구워지는 방식, 외곽선과 그림자가 머티리얼인 이유, 자간과 행간의 기준 차이, 상자에 글이 안 들어갈 때 일어나는 일을 그림으로 봅니다."
author: "유니얼"
pubDate: 2026-09-16
category: "game-dev/unity/ui"
tags: ["Unity", "UI", "uGUI"]
canonical: https://blog.unialgames.com/posts/unity-ui-textmeshpro/
---
시안의 글자를 Unity 에 옮기면 미묘하게 어긋납니다. 굵기가 다르고, 자간이 벌어지고, 어떤 글자는 아예 안 보입니다.

Unity 의 글자는 **TextMeshPro** 가 그립니다. 그리고 TextMeshPro 는 폰트 파일을 그때그때 읽어서 글자를 그리지 않습니다. 쓸 글자를 **미리 그림으로 구워 두고** 그 그림을 붙입니다. 위의 어긋남은 거의 다 여기서 나옵니다.

## 글자는 미리 구워서 붙입니다

<figure class="diagram">
<svg viewBox="0 0 680 260" role="img" aria-label="폰트 파일을 Font Asset Creator 로 구우면 글자 그림이 담긴 아틀라스 텍스처와 머티리얼이 나온다">
<rect x="20" y="50" width="150" height="110" rx="6" fill="var(--bg)" stroke="var(--border)" stroke-width="1.5"></rect><text x="34" y="74" font-size="13" fill="var(--text)">폰트 파일</text><text x="34" y="96" font-size="11" fill="var(--text-muted)">.ttf / .otf</text><text x="34" y="114" font-size="11" fill="var(--text-muted)">글자의 윤곽선이</text><text x="34" y="132" font-size="11" fill="var(--text-muted)">수식으로 들어 있음</text>
<line x1="176" y1="105" x2="205" y2="105" stroke="var(--text-muted)" stroke-width="1.5"></line><polygon points="205,100 214,105 205,110" fill="var(--text-muted)"></polygon>
<rect x="220" y="40" width="190" height="130" rx="6" fill="var(--bg)" stroke="var(--border)" stroke-width="1.5"></rect><text x="234" y="64" font-size="13" fill="var(--text)">Font Asset Creator</text><text x="234" y="86" font-size="11" fill="var(--text-muted)">어떤 글자를 구울지</text><text x="234" y="104" font-size="11" fill="var(--text-muted)">아틀라스 해상도</text><text x="234" y="122" font-size="11" fill="var(--text-muted)">패딩</text><text x="234" y="140" font-size="11" fill="var(--text-muted)">SDF 로 구울지</text>
<line x1="416" y1="105" x2="445" y2="105" stroke="var(--text-muted)" stroke-width="1.5"></line><polygon points="445,100 454,105 445,110" fill="var(--text-muted)"></polygon>
<rect x="460" y="30" width="200" height="160" rx="6" fill="var(--accent-soft)" stroke="var(--accent)" stroke-width="1.5"></rect><text x="474" y="54" font-size="13" fill="var(--text)">Font Asset</text>
<text x="474" y="66" font-size="11" fill="var(--text-muted)">아틀라스 텍스처</text>
<rect x="476" y="76" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="496" y="76" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="516" y="76" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="536" y="76" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="556" y="76" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="476" y="96" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="496" y="96" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="516" y="96" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="536" y="96" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="556" y="96" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="476" y="116" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="496" y="116" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="516" y="116" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="536" y="116" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<rect x="556" y="116" width="17" height="17" rx="2" fill="var(--bg)" stroke="var(--accent)" stroke-opacity="0.6"></rect>
<text x="474" y="156" font-size="11" fill="var(--text-muted)">+ 머티리얼</text>
<text x="474" y="176" font-size="11" fill="var(--text-muted)">(색, 외곽선, 그림자)</text>
<text x="20" y="220" font-size="12" fill="var(--text)">게임에 들어가는 것은 폰트 파일이 아니라 이 아틀라스입니다.</text>
<text x="20" y="242" font-size="12" fill="var(--warn)">구울 때 넣지 않은 글자는 화면에 안 나오거나 다른 폰트로 대신 나옵니다.</text>
</svg>
<figcaption>폰트 파일은 폰트 에셋으로 구워져서 아틀라스 텍스처와 머티리얼이 됩니다.</figcaption>
</figure>

폰트 파일을 그대로 넣는 것이 아니라 **폰트 에셋** 을 만들어서 넣습니다. 만들 때 정하는 것은 세 가지입니다.

- **어떤 글자를 구울지.** 목록에 없는 글자는 게임에서 안 나옵니다
- **아틀라스 해상도.** 크면 글자 가장자리가 곱게 나오고 텍스처도 커집니다
- **패딩.** 글자 그림 둘레에 두는 여백입니다. 좁으면 외곽선이나 그림자를 두껍게 줄 자리가 없습니다

글자는 픽셀 그대로가 아니라 **가장자리까지의 거리** 로 구워집니다. 그래서 같은 폰트 에셋 하나로 큰 제목과 작은 설명을 다 그려도 가장자리가 뭉개지지 않고, 외곽선과 그림자를 그림 없이 만들 수 있습니다.

## 한글은 글자 수부터 다릅니다

<figure class="diagram">
<svg viewBox="0 0 680 300" role="img" aria-label="영문 95자, 완성형 한글 2350자, 현대 한글 11172자가 아틀라스를 각각 얼마나 차지하는지">
<text x="30" y="28" font-size="13" fill="var(--text)">영문과 숫자, 기호</text>
<text x="30" y="48" font-size="12" font-family="var(--font-mono)" fill="var(--accent)">95 자</text>
<rect x="30" y="64" width="120" height="120" rx="4" fill="var(--bg)" stroke="var(--border)"></rect>
<rect x="30" y="179" width="120" height="5" rx="2" fill="var(--accent)" fill-opacity="0.35"></rect>
<line x1="30" y1="179" x2="150" y2="179" stroke="var(--accent)" stroke-width="1.5"></line>
<text x="30" y="208" font-size="12" fill="var(--text-muted)">한 귀퉁이면 충분</text>
<text x="30" y="226" font-size="11" fill="var(--text-muted)">텍스처 1 장</text>
<text x="250" y="28" font-size="13" fill="var(--text)">완성형 한글</text>
<text x="250" y="48" font-size="12" font-family="var(--font-mono)" fill="var(--accent)">2,350 자</text>
<rect x="250" y="64" width="120" height="120" rx="4" fill="var(--bg)" stroke="var(--border)"></rect>
<rect x="250" y="122.69565217391303" width="120" height="61.30434782608696" rx="2" fill="var(--accent)" fill-opacity="0.35"></rect>
<line x1="250" y1="122.69565217391303" x2="370" y2="122.69565217391303" stroke="var(--accent)" stroke-width="1.5"></line>
<text x="250" y="208" font-size="12" fill="var(--text-muted)">한 장의 절반쯤</text>
<text x="250" y="226" font-size="11" fill="var(--text-muted)">텍스처 1 장</text>
<text x="470" y="28" font-size="13" fill="var(--text)">현대 한글 전체</text>
<text x="470" y="48" font-size="12" font-family="var(--font-mono)" fill="var(--accent)">11,172 자</text>
<rect x="470" y="64" width="120" height="120" rx="4" fill="var(--bg)" stroke="var(--border)"></rect>
<rect x="470" y="64.0" width="120" height="120.0" rx="2" fill="var(--accent)" fill-opacity="0.35"></rect>
<line x1="470" y1="64.0" x2="590" y2="64.0" stroke="var(--accent)" stroke-width="1.5"></line>
<rect x="486" y="74" width="120" height="120" rx="4" fill="var(--bg)" stroke="var(--border)"></rect>
<rect x="486" y="74.0" width="120" height="120.0" rx="2" fill="var(--accent)" fill-opacity="0.35"></rect>
<line x1="486" y1="74.0" x2="606" y2="74.0" stroke="var(--accent)" stroke-width="1.5"></line>
<rect x="502" y="84" width="120" height="120" rx="4" fill="var(--bg)" stroke="var(--border)"></rect>
<rect x="502" y="152.55652173913046" width="120" height="51.443478260869554" rx="2" fill="var(--accent)" fill-opacity="0.35"></rect>
<line x1="502" y1="152.55652173913046" x2="622" y2="152.55652173913046" stroke="var(--accent)" stroke-width="1.5"></line>
<text x="470" y="228" font-size="12" fill="var(--text-muted)">여러 장으로 나뉨</text>
<text x="470" y="246" font-size="11" fill="var(--text-muted)">텍스처 3 장</text>
<text x="30" y="286" font-size="12" fill="var(--text-muted)">글자 하나가 60픽셀 자리를 쓰고 텍스처가 4096 × 4096 이라고 잡았을 때의 대략치입니다.</text>
</svg>
<figcaption>글자 수가 곧 텍스처 장수입니다. 한글은 영문과 자릿수가 다릅니다.</figcaption>
</figure>

영문은 대소문자와 숫자, 기호를 합쳐 백 자가 안 됩니다. 한글은 초성 19, 중성 21, 종성 28 의 조합이라 현대 한글만 세어도 11,172 자입니다. 옛날부터 많이 쓰는 완성형 기준으로 추려도 2,350 자입니다.

그래서 한글 폰트는 굽는 방식을 골라야 합니다.

- **미리 다 구워 두기.** 나올 글자가 정해져 있을 때 씁니다. 실행 중에 멈칫하는 일이 없는 대신 텍스처가 큽니다
- **그때그때 채우기.** 처음 나오는 글자를 그 순간 아틀라스에 추가합니다. 유저 이름, 채팅, 외부에서 받아 오는 문구처럼 무슨 글자가 올지 모르는 곳에 씁니다
- 어느 쪽이든 **없는 글자는 다른 폰트에서 찾아 옵니다.** 그 폰트도 없으면 빈칸이 됩니다. 시안에 없던 특수문자나 이모지가 갑자기 빈칸으로 나오는 이유입니다

여기서 디자이너가 도울 수 있는 것이 큽니다. **화면에 나오는 고정 문구를 모아 주면 그 글자만 구울 수 있습니다.** 텍스처가 몇 배로 줄어듭니다. 폰트를 고를 때 **게임에 넣어도 되는 라이선스인지** 같이 확인해 주면 더 좋습니다.

## 외곽선과 그림자는 그림이 아니라 머티리얼입니다

<x-tabs>
<figure class="diagram" data-tab="시안에서 준 효과">
<svg viewBox="0 0 680 250" role="img" aria-label="시안에서 텍스트에 건 효과">
<rect x="30" y="34" width="240" height="110" rx="6" fill="var(--bg-subtle)" stroke="var(--border)"></rect>
<text x="63" y="107" font-size="34" font-weight="700" fill="var(--text)" fill-opacity="0.3">레벨 12</text><text x="60" y="104" font-size="34" font-weight="700" stroke="var(--accent)" stroke-width="4" stroke-linejoin="round" fill="none">레벨 12</text><text x="60" y="104" font-size="34" font-weight="700" fill="var(--text)">레벨 12</text>
<text x="30" y="26" font-size="12" fill="var(--text-muted)">보이는 모습</text>
<text x="320" y="26" font-size="12" fill="var(--text-muted)">시안의 효과 패널</text>
<text x="320" y="58" font-size="12" fill="var(--text-muted)">Stroke</text><rect x="470" y="44" width="110" height="20" rx="3" fill="var(--bg)" stroke="var(--border)"></rect><text x="478" y="58" font-size="11" font-family="var(--font-mono)" fill="var(--text)">2, 바깥쪽</text><text x="320" y="84" font-size="12" fill="var(--text-muted)">Drop shadow</text><rect x="470" y="70" width="110" height="20" rx="3" fill="var(--bg)" stroke="var(--border)"></rect><text x="478" y="84" font-size="11" font-family="var(--font-mono)" fill="var(--text)">X 0  Y 2  B 4</text><text x="320" y="110" font-size="12" fill="var(--text-muted)">Fill</text><rect x="470" y="96" width="110" height="20" rx="3" fill="var(--bg)" stroke="var(--border)"></rect><text x="478" y="110" font-size="11" font-family="var(--font-mono)" fill="var(--text)">#FFFFFF</text>
<text x="30" y="178" font-size="12" fill="var(--text)">Unity 에는 이 값이 그대로 들어가는 칸이 없습니다.</text>
<text x="30" y="200" font-size="12" fill="var(--text-muted)">두께와 그림자 거리는 글자 크기에 대한 비율로 다시 계산해서 넣습니다.</text>
<text x="30" y="222" font-size="12" fill="var(--text-muted)">블러 반경이 큰 그림자, 여러 겹 그림자, 그라데이션 채움은 기본 기능으로는 안 나옵니다.</text>
</svg>
<figcaption>시안의 두께와 그림자 값은 Unity 의 같은 이름 칸으로 바로 옮겨지지 않습니다.</figcaption>
</figure>
<figure class="diagram" data-tab="Unity 에서 만드는 자리">
<svg viewBox="0 0 680 250" role="img" aria-label="Unity 에서 같은 효과를 만드는 자리">
<rect x="30" y="34" width="240" height="110" rx="6" fill="var(--bg-subtle)" stroke="var(--border)"></rect>
<text x="63" y="107" font-size="34" font-weight="700" fill="var(--text)" fill-opacity="0.3">레벨 12</text><text x="60" y="104" font-size="34" font-weight="700" stroke="var(--accent)" stroke-width="4" stroke-linejoin="round" fill="none">레벨 12</text><text x="60" y="104" font-size="34" font-weight="700" fill="var(--text)">레벨 12</text>
<text x="30" y="26" font-size="12" fill="var(--text-muted)">보이는 모습</text>
<text x="320" y="26" font-size="12" fill="var(--text-muted)">머티리얼 (폰트 에셋에 딸린)</text>
<text x="320" y="58" font-size="12" fill="var(--text-muted)">Face  Dilate</text><rect x="470" y="44" width="110" height="20" rx="3" fill="var(--bg)" stroke="var(--border)"></rect><text x="478" y="58" font-size="11" font-family="var(--font-mono)" fill="var(--text)">0.1</text><text x="320" y="84" font-size="12" fill="var(--text)">Outline  Thickness</text><rect x="470" y="70" width="110" height="20" rx="3" fill="var(--bg)" stroke="var(--accent)"></rect><text x="478" y="84" font-size="11" font-family="var(--font-mono)" fill="var(--text)">0.2</text><text x="320" y="110" font-size="12" fill="var(--text)">Underlay  Offset X, Y</text><rect x="470" y="96" width="110" height="20" rx="3" fill="var(--bg)" stroke="var(--accent)"></rect><text x="478" y="110" font-size="11" font-family="var(--font-mono)" fill="var(--text)">0, -0.6</text><text x="320" y="136" font-size="12" fill="var(--text-muted)">Underlay  Softness</text><rect x="470" y="122" width="110" height="20" rx="3" fill="var(--bg)" stroke="var(--border)"></rect><text x="478" y="136" font-size="11" font-family="var(--font-mono)" fill="var(--text)">0.3</text>
<text x="30" y="178" font-size="12" fill="var(--text)">외곽선과 그림자는 그림이 아니라 머티리얼 값입니다.</text>
<text x="30" y="200" font-size="12" fill="var(--warn)">구울 때 준 패딩이 좁으면 두꺼운 외곽선이 잘립니다. 두꺼운 외곽선을 쓸 거면 미리 알려 주세요.</text>
<text x="30" y="222" font-size="12" fill="var(--text-muted)">값이 다르면 머티리얼도 따로 만들어집니다. 종류가 늘수록 글자를 나눠 그립니다.</text>
</svg>
<figcaption>같은 폰트라도 효과 값이 다르면 머티리얼이 따로 생깁니다.</figcaption>
</figure>
</x-tabs>

- 시안의 **Stroke 2px** 같은 값은 그대로 들어가는 칸이 없습니다. 글자 크기에 대한 비율로 다시 잡습니다. 그래서 **글자 크기가 바뀌면 두께도 같이 바뀝니다**
- 구울 때 준 **패딩이 좁으면 두꺼운 외곽선이 잘립니다.** 두꺼운 테두리를 쓸 거라면 미리 알려 주세요. 폰트 에셋을 다시 구워야 합니다
- 효과 값이 다르면 **머티리얼이 하나씩 더 생깁니다.** 같은 폰트를 쓰는 글자라도 스타일이 섞이면 나눠 그립니다. 화면에 쓰는 글자 스타일 종류를 줄이는 것이 그대로 이득입니다
- 반경이 큰 블러 그림자, 여러 겹 그림자, 글자 안쪽 그라데이션은 기본 기능으로는 안 나옵니다. 꼭 필요하면 이미지로 뽑는 편이 빠릅니다

## 굵게는 진짜 굵은 폰트가 아닐 수 있습니다

<figure class="diagram">
<svg viewBox="0 0 680 220" role="img" aria-label="굵게는 굵은 폰트 파일이 연결돼 있으면 그 파일로, 없으면 기존 글자를 부풀려서 만든다">
<text x="40" y="34" font-size="13" fill="var(--text)">보통</text>
<rect x="40" y="46" width="160" height="70" rx="6" fill="var(--bg-subtle)" stroke="var(--border)"></rect>
<text x="62" y="92" font-size="30" font-weight="400" fill="var(--text)">획득</text>
<text x="40" y="138" font-size="12" fill="var(--text-muted)">원본 글자</text>
<text x="260" y="34" font-size="13" fill="var(--text)">굵은 파일이 있을 때</text>
<rect x="260" y="46" width="160" height="70" rx="6" fill="var(--bg-subtle)" stroke="var(--border)"></rect>
<text x="282" y="92" font-size="30" font-weight="800" fill="var(--text)">획득</text>
<text x="260" y="138" font-size="12" fill="var(--text-muted)">그 파일의 글자로 바뀜</text>
<text x="480" y="34" font-size="13" fill="var(--text)">없을 때</text>
<rect x="480" y="46" width="160" height="70" rx="6" fill="var(--bg-subtle)" stroke="var(--border)"></rect>
<text x="502" y="92" font-size="30" font-weight="400" stroke="var(--text)" stroke-width="2.2" fill="var(--text)">획득</text>
<text x="480" y="138" font-size="12" fill="var(--text-muted)">기존 글자를 부풀림</text>
<text x="480" y="158" font-size="12" fill="var(--warn)">획 사이가 메워집니다</text>
<text x="40" y="190" font-size="12" fill="var(--text)">시안에서 굵은 웨이트를 썼으면 그 웨이트의 폰트 파일도 같이 넘겨 주세요.</text>
<text x="40" y="210" font-size="12" fill="var(--text-muted)">웨이트마다 폰트 에셋을 따로 굽고, 굵게 표시를 할 때 그 에셋을 쓰도록 연결해 둡니다.</text>
</svg>
<figcaption>굵은 웨이트 파일이 없으면 원래 글자를 부풀려서 굵게 만듭니다.</figcaption>
</figure>

굵게 표시를 하면 Unity 는 먼저 **굵은 웨이트의 폰트 에셋이 연결돼 있는지** 봅니다. 있으면 그 파일의 글자로 바꿔 그리고, 없으면 원래 글자를 부풀리고 자간을 살짝 벌려서 굵은 척을 합니다. 기울임도 마찬가지로 진짜 이탤릭 폰트가 아니라 글자를 기울이는 처리입니다.

한글은 부풀린 굵기가 특히 티가 납니다. 획 사이가 메워져서 뭉개집니다. **시안에서 Bold 나 Medium 같은 웨이트를 썼으면 그 웨이트의 폰트 파일도 같이 넘겨 주세요.** 웨이트마다 폰트 에셋을 따로 굽고 연결해 두면 시안 그대로 나옵니다.

## 자간과 행간은 기준이 다릅니다

<figure class="diagram">
<svg viewBox="0 0 680 370" role="img" aria-label="Figma 의 자간 퍼센트는 TMP 값에 그대로 들어가지만, 행간은 줄 높이 자체가 아니라 기본 줄 높이에 더하는 값이다">
<rect x="20" y="30" width="200" height="120" rx="6" fill="var(--bg)" stroke="var(--border)"></rect>
<text x="34" y="54" font-size="13" fill="var(--text)">Figma</text>
<text x="34" y="80" font-size="12" fill="var(--text-muted)">글자 크기</text><text x="130" y="80" font-size="12" font-family="var(--font-mono)" fill="var(--text)">40</text>
<text x="34" y="102" font-size="12" fill="var(--text-muted)">자간</text><text x="130" y="102" font-size="12" font-family="var(--font-mono)" fill="var(--text)">2%</text>
<text x="34" y="124" font-size="12" fill="var(--text-muted)">행간</text><text x="130" y="124" font-size="12" font-family="var(--font-mono)" fill="var(--text)">60 (150%)</text>
<rect x="460" y="30" width="200" height="120" rx="6" fill="var(--accent-soft)" stroke="var(--accent)"></rect>
<text x="474" y="54" font-size="13" fill="var(--text)">TextMeshPro</text>
<text x="474" y="80" font-size="12" fill="var(--text-muted)">Font Size</text><text x="588" y="80" font-size="12" font-family="var(--font-mono)" fill="var(--text)">40</text>
<text x="474" y="102" font-size="12" fill="var(--text-muted)">자간</text><text x="588" y="102" font-size="12" font-family="var(--font-mono)" fill="var(--text)">2</text>
<text x="474" y="124" font-size="12" fill="var(--text-muted)">행간</text><text x="588" y="124" font-size="12" font-family="var(--font-mono)" fill="var(--text)">다시 계산</text>
<line x1="240" y1="92" x2="431" y2="92" stroke="var(--text-muted)" stroke-width="1.5"></line><polygon points="431,87 440,92 431,97" fill="var(--text-muted)"></polygon>
<text x="256" y="80" font-size="12" fill="var(--accent2)">자간은 숫자 그대로</text>
<text x="256" y="116" font-size="12" fill="var(--warn)">행간은 그대로 못 옮깁니다</text>
<text x="20" y="188" font-size="12" fill="var(--text)">TextMeshPro 의 자간 값 100 이 글자 크기 한 배입니다.</text>
<text x="20" y="208" font-size="12" fill="var(--text-muted)">시안의 자간이 픽셀이면 픽셀 ÷ 글자 크기 × 100 으로 바꿔 넣습니다.</text>
<text x="20" y="236" font-size="13" fill="var(--text)">행간은 단위보다 기준이 다릅니다</text>
<rect x="120" y="252" width="300" height="34" rx="3" fill="var(--accent-soft)" stroke="var(--accent)" stroke-opacity="0.5"></rect>
<text x="134" y="275" font-size="15" fill="var(--text)">첫 번째 줄입니다</text>
<rect x="120" y="310" width="300" height="34" rx="3" fill="var(--accent-soft)" stroke="var(--accent)" stroke-opacity="0.5"></rect>
<text x="134" y="333" font-size="15" fill="var(--text)">두 번째 줄입니다</text>
<line x1="104" y1="252" x2="104" y2="286" stroke="var(--text-muted)"></line><line x1="100" y1="252" x2="108" y2="252" stroke="var(--text-muted)"></line><line x1="100" y1="286" x2="108" y2="286" stroke="var(--text-muted)"></line>
<text x="20" y="274" font-size="11" fill="var(--text-muted)">폰트가 정한</text><text x="20" y="288" font-size="11" fill="var(--text-muted)">기본 줄 높이</text>
<line x1="104" y1="286" x2="104" y2="310" stroke="var(--warn)"></line><line x1="100" y1="310" x2="108" y2="310" stroke="var(--warn)"></line>
<text x="436" y="292" font-size="12" fill="var(--warn)">Line Spacing 은 이 틈만</text>
<text x="436" y="310" font-size="12" fill="var(--warn)">늘리거나 줄입니다</text>
<text x="436" y="336" font-size="12" fill="var(--text-muted)">시안의 행간 값을 그대로</text>
<text x="436" y="354" font-size="12" fill="var(--text-muted)">넣으면 두 배로 벌어집니다</text>
</svg>
<figcaption>자간은 글자 크기의 백분율, 행간은 기본 줄 높이에 더하는 값입니다.</figcaption>
</figure>

- **자간의 단위는 글자 크기의 백분율입니다.** TextMeshPro 의 자간 값 100 이 글자 크기 한 배입니다. 시안의 자간이 퍼센트로 적혀 있으면 그 숫자를 그대로 넣으면 되고, 픽셀로 적혀 있으면 `픽셀 ÷ 글자 크기 × 100` 으로 바꿔서 넣습니다
- **행간은 줄 높이 자체가 아니라 기본 줄 높이에 더하는 값입니다.** 시안의 행간 60 을 그대로 넣으면 줄 사이가 두 배 가까이 벌어집니다. 넣을 값은 `(원하는 줄 높이 − 폰트의 기본 줄 높이) ÷ 글자 크기 × 100` 입니다
- 기본 줄 높이는 **폰트마다 다릅니다.** 폰트를 바꾸면 자간과 행간을 다시 맞춰야 합니다

이런 계산을 매번 하기 싫으면 **시안에 자간은 퍼센트로, 행간은 원하는 줄 높이 픽셀로** 적어 주세요. 옮기는 쪽에서 계산할 거리가 줄어듭니다.

## 상자에 글이 안 들어갈 때

<x-text>
<script type="application/json">
{
  "label": "상자 너비와 설정을 바꿔 가며",
  "text": "전투에서 승리해 얻은 보상을 확인하세요",
  "default": { "w": 0 },
  "note": "점선이 Text 의 상자입니다. 글자 크기는 22 로 시작합니다."
}
</script>
</x-text>

시안에서는 문구 길이를 디자이너가 정하지만, 게임에서는 유저 이름이 들어가고 번역이 들어가고 숫자가 늘어납니다. 안 들어가는 순간 무엇을 할지는 **네 가지 중에서 고릅니다.**

- **줄바꿈** 을 끄면 아무리 상자가 높아도 한 줄로만 놓습니다. 한 줄짜리 값에만 끕니다
- **Overflow** 는 상자 밖으로 그대로 넘칩니다. 경고도 없고 다른 요소와 겹칩니다. 기본값이라 사고가 제일 많이 납니다
- **Ellipsis** 는 들어가는 데까지 두고 마지막을 `…` 로 바꿉니다. 이름이나 아이템처럼 끝이 잘려도 되는 것에 씁니다
- **Truncate** 는 자른 표시 없이 끊습니다. 잘렸는지 아닌지 유저가 알 수 없으니 거의 안 씁니다
- **Auto Size** 는 글자 크기를 줄여서 맞춥니다. 편해 보이지만 **화면마다 글자 크기가 달라집니다.** 같은 줄에 놓인 두 글자의 크기가 다르게 나오는 화면은 대개 이것 때문입니다

그래서 상자는 **가장 긴 경우를 기준으로** 잡는 것이 안전합니다. 시안을 넘길 때 이름이 가장 길 때, 숫자가 가장 클 때, 번역이 가장 길 때의 예시 문구를 하나씩 같이 주면 그 자리에서 확인하고 넘어갈 수 있습니다.

## 시안을 넘길 때 적어 주면 좋은 것

| 항목 | 적어 줄 것 |
| --- | --- |
| 폰트 | 웨이트별 파일 전부와 게임에 써도 되는 라이선스인지 |
| 글자 범위 | 고정 문구만 나오는지, 유저가 입력한 글자가 나오는지 |
| 크기와 간격 | 글자 크기, 자간은 퍼센트, 행간은 원하는 줄 높이 |
| 효과 | 외곽선 두께와 색, 그림자 방향과 거리. 그리고 화면 전체에서 몇 종류를 쓰는지 |
| 넘칠 때 | 줄바꿈, `…`, 자르기 중 무엇으로 할지 |
| 가장 긴 경우 | 이름, 숫자, 번역이 가장 길 때의 예시 문구 |

## 정리

- TextMeshPro 는 쓸 글자를 미리 그림으로 구워 두고 그 그림을 붙입니다. 구울 때 안 넣은 글자는 화면에 안 나옵니다
- 한글은 현대 글자만 11,172 자라 굽는 범위를 정해야 합니다. 고정 문구 목록을 주면 그 글자만 구울 수 있습니다
- 외곽선과 그림자는 그림이 아니라 머티리얼 값입니다. 패딩이 좁으면 두껍게 못 주고, 스타일 종류가 늘면 글자를 나눠 그립니다
- 굵게는 굵은 폰트 파일이 연결돼 있을 때만 진짜 굵은 글자입니다. 없으면 원래 글자를 부풀립니다
- 자간 값 100 이 글자 크기 한 배이고, 행간은 기본 줄 높이에 더하는 값입니다. 시안 숫자를 그대로 넣으면 안 맞습니다
- 상자에 안 들어갈 때의 처리는 넷 중에 고르는 일입니다. 정해 두지 않으면 기본값대로 그냥 넘칩니다