この記事はSTYLY Advent Calendar 2025の19日目の記事です。
「Lexiphere」シリーズ記事
概要編
Webページ構築編
STYLYシーン実装編
Unity TextMesh Proのベストプラクティス(本稿)
要約
一週間という短い期間でシステム完成させ、いざ本番。
しかしよくよく見てみると、一部の文字が□になってしまう不具合が発生!
今回はもうしょうがないとして、次の機会のために修正を行った。
一体何が原因で、どのように対応したのか。
先に結論
- 文字が□になってしまったのは、Dynamic Fontで文字を表示する際にAtlasサイズを超えてしまったため。
- ベストプラクティス:Static Fontで広範な文字コード範囲を指定しつつ、Fallbackで十分なAtlasサイズのDynamic Fontを指定
TextMeshProとは
TextMeshProは、Unityにおける高品質なテキスト描画システムです。
従来のUI Textと異なり、Signed Distance Field(SDF)技術を使用しているため、拡大縮小してもテキストがぼやけず、アウトラインや影などのエフェクトも軽量に実現できます。
現在はUnityに標準搭載されており、UI Textに代わる推奨テキストシステムとなっています。TextMeshProでテキストを描画するには「Font Asset」が必要です。
これは元のフォントファイル(.ttf / .otf)から生成するアセットで、文字のグリフ情報を含むAtlasテクスチャを持っています。
ちょっとデバッグ的に文字を表示したいだけならLegacyTextで済ませちゃうこともありますが、Unity2020あたりからTextMeshProがデフォルトのテキストシステムになっています。
しかし正しく扱うにはちゃんとした理解が必要で、初めはちょっと面倒くさいんですよね。
まずはおさらい。
Dynamic FontとStatic Font
Font Assetには「Atlas Population Mode」という設定があり、DynamicとStaticの2種類があります。
Static Font
Font Asset生成時に指定した文字だけをAtlasに登録し、実行時には追加しないモードです。
指定してない文字を表示しようとすると□になります。
使用する文字が事前に確定していて大した量じゃないなら、このパターンが良いかと思います。
以前書いた記事でもStatic Fontを使用していました。
Dynamic Font
実行時に、テキストで使用される文字を検出し、Atlasテクスチャに動的に文字を追加していくモードです。
今回は事前にどのような文字が使われるか分からないのでこちらにしました。
トラブル
実は自分がDynamic Fontを使ったことがなく、仕組みをちゃんと理解しておりませんでした。
そのためAtlas Width/Heightをデフォルトの1024x1024のまま使っていました。
手元で軽くテストした際には特に問題はありません。
しかし本番と同じように入力したわけではなく、適当なセンテンスを何度か表示しただけでした。
本番では15分以上に渡り、実に様々な文字が入力されました。
その結果1024x1024に収まりきらなくなり、それ以降に新たに登場した文字が□になっていました。
やはりテストは本番と同等のことを試さないと駄目ですね。
どうすれば良かったのか
単純にAtlasサイズが小さいので十分大きくしておく、ぐらいの対応はしておくべきでした。
しかしこれも問題の発生が先送りされるだけで、本当に大丈夫かどうかは怪しいです。
ちなみにTextMeshPro関連記事を検索すると、Static FontでCustom Character Listに広範な日本語文字を指定する手法がよく見つかります。
参考記事
大抵の場合はこれでもいいのですがあくまで"ほぼ全て"であって、そこから抜け落ちた文字は□になってしまいます。
特に今回はLiveNovelingであり、文学作品です。
普段使わないような文字が使われる可能性は大いにありそうですね。
ベストプラクティス
本番の後にはなりますが、次の機会に備えて下記の対応を行いました。
まず前述のようにStatic Fontを作成し、Custom Character Listに広範な日本語文字を指定します。
その上でFallback Font Assetsに、大きめのAtlasサイズのDynamic Fontを指定します。
こうすることでStatic Fontでカバーできなかった文字だけDynamic Fontで表示します。
これも完璧かというとそうではなく、結局Dynamic FontのAtlasが埋まってしまったら□になる現象は発生します。
しかし実際にカバーできている文字の範囲から考えて、まず超えることはないものと考え、良しとしました。
あくまで15分程度のLiveNovelingのためのシステムなので、まぁ割り切っても良いでしょう。
青空文庫のデータを全て表示しようとする、みたいな要件の場合はこれだとマズいかもしれません。
下記のアーカイヴシーンでは既に対応済みになっています。
Multi Atlas Textures
この記事を書きながら更に調べていたところ、どうもDynamic FontのMulti Atlas Texturesにチェックを入れると良さそうです。
これはAtlasが埋まった際に、必要に応じて追加のAtlasを生成してくれるオプションらしい。
うう〜ん、わざわざFallback Fontやら何やらせずに、Dynamic Fontでこれを設定しておけば十分だったかも。
しかしこの場合、理屈上はメモリを上限なく確保するのが気になりますね。
まぁ現実的に問題になることはなさそうですが、要件に合わせてベストな解決法は違うってことですかね。
最後に
「踊れる文学」を開催したいと思ってくださる書店や図書館など、本のある場所を全国的に公募しています。
下記の記事をご参照ください。

