コラム:TextMeshProの用語の補足


投稿日:2024年3月31日 | 最終更新日:2024年3月31日

概要

フォントやテキスト描画にまつわる用語で補足が必要な用語を以下にまとめました。
ゲーム開発者にとって意味がわかりづらかったり、TextMeshProを使う際に注意が必要な点をまとめてあります。

用語まとめ

グリフ

グリフはおおざっぱには字体…つまり文字の見た目のことです。
TextMeshProでは、テクスチャにSDF画像が描きこまれ、Glyph_Tableにデータが設定されています。

グリフと文字は1対1ではないことに注意してください。
違うUnicodeであっても共通のグリフをもつことがあります。
たとえば、(改行しないハイフン。U+2011)と、-(ハイフン。U+002D)は同じグリフであることがあります。

また、フォントファイルによっては同じ文字が複数のグリフを持つことがあります。
たとえば、フォントファイルには縦書き用のグリフデータを持っているものがあり、一つの文字が横書きと縦書きで二種類のグリフデータを持っている場合があります。などの合字がこれにあたります。
(なお、UnityやTextMeshProは対応していないので縦書き用のグリフデータを扱うことはできません)

 
横書き    縦書き

フォントや文字セットの仕様にあるグリフ数=文字数ではない

上記の通りグリフと文字は一対一ではないため、フォントや文字セットの仕様に書かれているグリフ数を文字数と混同しないようにしましょう。
Adobeの文字コレクションを例にとると
Adobe-Japan1-7で追加されたグリフ数は2個ですが、文字としては(U+32FF)1文字だけになります。
Adobe-Japan1-3はグリフの追加数は634ありますが、既存の文字の回転バージョンが追加されているので、追加文字数は0個になります。
TextMeshProでは、1文字に複数グリフがあっても対応していないため、これらのグリフは無視されます。
文字数の見積もりなどをする際には、グリフ数と文字数の違いに注意してください。

サロゲートペア文字

UnityやTextMeshProでは、文字をUnicodeという文字コードに従って処理しています。
Unicodeは16bitで始まったのですが全世界の文字を扱うには16bit(最大65,536)では足りないため、収まらない文字を扱うために途中から拡張された仕組みがサロゲートペアです。
これはペアとなっている2つのUnicodeを一つの文字として扱う少し特殊なものです。
日本語では、(ホッケ)のような稀な漢字にも使われているほか、人名などでも使われることがあります。

TextMeshProはこのサロゲートペア文字をサポートしています。
プログラム的にはサロゲートペアはstring内の「char2個で1文字となる」という形になるため、対応したプログラムをしないと文字数がズレるなどの不具合が起きる点に注意しましょう。
また、Unityエディタ上ではまだサロゲートペア文字は表示できないようなので、インスペクター内やコンソールのDebugLogなどに正常に表示されない点にも注意してください。

文字の間隔

テキストを描画する際は「文字の間に適度な間隔をあける」ことが大切な要素となっています。
参考:ベタ組み・プロポーショナルメトリクスとの違い | フォント用語集 | 文字の手帖 | 株式会社モリサワ

字間とか文字間とか、カーニングとか色々な呼び方があるのですが、正確にどれを指しているのかがけっこう曖昧になりがちです。
TextMeshProでの扱いを以下にまとめました。

プロポーショナル

グリフごとに設定されている、固有の間隔です。
フォントファイルに設定されている数値をもとにGlyph_Tableに文字の表示幅と左右の間隔のデータが設定されています。
手動で調整することも可能です。

TextMeshProでは基本的にはこのプロポーショナルで表示されますが、
<mspace>タグを使うことで全ての文字を等幅で表示することができます。

ペアカーニング

特定の文字同士の間の間隔の設定です。
フォントファイルに設定されている数値をもとにGlyph Adjustment Tableに設定されています。
ただし、UnityやTextMeshが対応できるフォントファイルが少ないようでデータが読み込めることは少ないようです。
手動で追加設定することも可能です。


AVVAにペアカーニングを適用

文字間(Character Spacing)

全ての文字同士に追加される間隔です。
コンポーネントの「Spacing」の「Character」で基本値を設定します。
リッチテキストタグの<cspace>タグでも設定できます。