はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】指定の文字だけをフォント(TextMeshPro)を作成して、無駄な容量を削減する

はじめに

今回は指定した文字だけをフォント(TextMeshPro)に入れて、無駄な容量を削減する方法についての記事になります!

私はずっとTextMeshProFont Asset Creatorを利用してフォントのアセットを作成して利用していました。

このFont Asset CreatorではCustom RangeCustom Charactorを利用して指定した文字だけをアセットに含めることができます。

しかし、ふとその作成されたアセットをみてみると、全く容量が削減されていないことに気づいてしまったのです。
追記)これはAtlas Resolutionを設定していないことが原因でした。この記事の後で紹介をします。

f:id:hanaaaaaachiru:20190605132833p:plain

これはかなりビックリだったのですが、これではないちゃんと容量を削減できる方法を見つけましたので、紹介をしたいと思います。

フリーソフトを使う

容量を削減しようと思ったとき、TextMeshProのフォントのアセットを作成する前から指定した文字だけを含めればよいことに気づきました。

それを実現するためには、サブセットフォントメーカーというフリーソフトを使うことで簡単にすることができます。
追記)これとほぼ同様の機能が既にUnityに備わっているようです。詳しくはこの記事の後半をご覧ください。

opentype.jp

またWindows版とMac版の両方があるので、安心ですね。

指定した文字だけを含むフォントを作成する

まずはサブセットフォントメーカーを起動しましょう。

f:id:hanaaaaaachiru:20190605133743p:plain

作成元のフォント、作成後のフォント、フォントに格納する文字を記入後、作成開始を押します。

f:id:hanaaaaaachiru:20190605135101p:plain

すると私の場合、4232kB→5kBまで容量を削減することができました。

TextMeshProのフォントのアセットの容量を削減する

上の方法ではフォント自体の容量を削減できたのですが、実はTextMeshPro自体に指定した文字だけを含む機能が備わっています。
追記)フォントにもCustom setという指定した文字だけを入れる機能があるみたいです。さきほどのフリーソフトは使わなくとも大丈夫かもしれません。

指定した文字だけを含むには、Custom Charactorを使うことでできます。

f:id:hanaaaaaachiru:20190605140452p:plain

ただこれをしただけでは文字を指定していないときと同じ容量のアセットが作成されます。

その理由はAtlas Resolutionを変更していないからです。

TextMeshProでは使用する文字を1枚の画像ファイルにする(アトラス化)するようです。

なので、いくら文字を減らしても画像ファイルの大きさを変化させなければ容量に変化はないというわけですね。

これを踏まえてAtlas Resolutionを変更してみましょう。

Atlas Resolutionのデフォルトが512*512で、すべてのASCII文字を含める、つまり128文字ぐらいが入ると書かれていました。

ただここはかなり感覚的で、どれが適切かを見極めるのは難しいかもしれません。もし詳しい方がいましたら、コメント等で教えていただけると嬉しいです。

私の場合、2048*2048→126*126でフォントを作成したところ、32777kB→40kBの削減になりました。

f:id:hanaaaaaachiru:20190605141909p:plain

さいごに

書きながら間違いに気づいたりを何度もしてしまったので、かなり見にくい記事になってしまって申し訳ありません。

もし時間があれば、簡単な手順をまとめた記事を書きたいと思います。