1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unity TextMesh Proのベストプラクティス

Posted at

この記事は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に広範な日本語文字を指定します。

Static Font

その上でFallback Font Assetsに、大きめのAtlasサイズのDynamic Fontを指定します。

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でこれを設定しておけば十分だったかも。
しかしこの場合、理屈上はメモリを上限なく確保するのが気になりますね。
まぁ現実的に問題になることはなさそうですが、要件に合わせてベストな解決法は違うってことですかね。

最後に

「踊れる文学」を開催したいと思ってくださる書店や図書館など、本のある場所を全国的に公募しています。
下記の記事をご参照ください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?