【Unity】Text Mesh Proで表示できない文字を非表示にする

UnityのText Mesh Proで表示できない文字を非表示にする方法です。

Unity2020.3.15f2
TextMeshPro 3.0.6

はじめに

TextMeshProでは、デフォルトでは表示できない文字は□で表示されます。
また一部の結合文字など特殊な文字もうまく処理できず、□が表示されてしまうことがあります。
例えば©️(コピーライトマーク)を表示しようとすると以下のようになります。

f:id:halya_11:20211228110824p:plain
□が表示されてしまう

本記事では、このように表示できない文字を非表示にする方法についてまとめます。

結合文字などの特殊な文字を削除する

まず一つ目の方法として、結合文字などの特殊な文字を判定して削除する方法があります。
以下はuGUI Textにおける例ですが、Text Mesh Proでも同じように処理することができます。

light11.hatenadiary.com

ただしこの方法では、「特殊な文字ではないがフォントに存在しない文字」は□で表示されてしまいます。

表示できない文字を削除せず非表示にする

二つ目は表示できない文字を削除せずに非表示にする方法です。少しHackyな方法になります。

まずText Mesh Proでは、表示できない文字=□を他の文字に置き換えることができます。
これはProject Settings > TextMesh Pro > Settings > Missing Character Unicodeから指定できます。

f:id:halya_11:20211228112050p:plain
Missing Character Unicode

ここにはUnicodeを10進数で指定します。
例えばAという文字=65313を指定すると、©️は以下のように表示されます。

f:id:halya_11:20211228112336p:plain
□がAになった

このAを幅がゼロの空白文字にできれば、表示できない文字をすべて非表示にできそうです。
そこでまず、架空の空白文字を作ります。
Window > TextMesh Pro > Font Asset Creatorを開いて、以下のような設定で適当に一文字だけ入れたアトラスを作ります。
フォントも文字もなんでも大丈夫です。

f:id:halya_11:20211228113133p:plain:w600
一文字だけ入れたアトラスを作る

こうしてアセットを作成したら、次にそのアセットのInspectorを表示します。
Character Tableに先程の文字が入っているので、UnicodeをFFFFFFに、Scaleをゼロに設定して架空の文字を作成します。

f:id:halya_11:20211228113426p:plain
架空の文字を作成

このアセットを、通常のフォントとして使用しているアセットのフォールバックとして設定します。

f:id:halya_11:20211228113620p:plain
フォールバックに先程のアセットを設定

あとはMissing Character Unicodeに16777215(FFFFFFの10進数)を設定するだけです。
ついでにその下のDisable warningsもオフにしておくと、表示できない文字が入力されても警告が出力されなくなります。

f:id:halya_11:20211228114040p:plain
Unicode設定

これで表示できない文字を削除せず非表示にすることができました。

f:id:halya_11:20211228114141p:plain
結果

関連

light11.hatenadiary.com