LoginSignup
1
1

More than 3 years have passed since last update.

【Unity】Text Mesh Proで文字化けする(□になる)箇所を見つける方法

Last updated at Posted at 2020-08-22

TextMeshProで表示できない文字がある

TextMeshProはデフォルトで日本語に対応していないため、各々で日本語フォントからアセットを作成する必要があります。
日本語を表示させるにはUnityのText Mesh Proでほぼ全ての日本語を表示させる の手順通りで大体は問題ありません。
ただ、仕様上「必要な文字をフォントアセットに追加している」に過ぎないため、非対応の文字が後々になって見つかる可能性はあります。

文字化けを見つけて直して…

テキストをTextMeshProコンポーネントに設定するところまでは問題ありません。
問題は設定されたフォントアセットによって文字が表示されるか否かが分かれるという点です。

0.CheckUndefine.jpg

テキストとフォントアセットを設定して、文字化けしている箇所を目で見て探し該当の文字を追加していく!
このやり方だと大量のテキストだけ用意されている状態であれば時間が掛かります。見落す危険もあります。

  1.  カタカナの「ろ」
  2.  漢字の「くち」
  3.   記号の「しかく」←コレ

文字化けだけ見つけたい

そもそもの話、Text Mesh Proは未対応の文字は□で表示しているわけです。
つまり処理的に『未対応の文字を見つける』ことはできるわけなんです。

大量の文字列に疲弊した人間が目で見て探す必要はないんです………。

文字化けを見つける

見つける方法は、TextMeshProのメンバ変数にあるTMP_FontAsset fontを使用します。
これはTextMeshProコンポーネントに設定されているフォントアセットを示す変数です。
TMP_FontAssetクラスのHasCahracters関数にテキストを渡すことで未対応の文字が返ってきます。

    // 対象のTextMeshProと見つからない文字
    var tmp = GetComponent<TextMeshProUGUI>();
    var missingCharacters = new List<char>();

    // TMP_FontAssetに見つからない文字があれば
    if (!tmp.font.HasCharacters(tmp.text, out missingCharacters))
    {
        // missingCharactersに非対応の文字が格納される
        foreach (var character in missingCharacters)
        {
            Debug.Log(character);
        }
    }

1.MissingCharacters.jpg

最後に

ログファイルに出力すれば完璧です。

文字化けを見つけたタイミングでエディターを確認できればいいのですが、そうでない場合(例えばビルドしたものをデバッガーに配布する際など)には

文字化けしてたんですけど、どの文字が表示できていないのか分からないんです…

みたいなことを言われて、大量のテキストデータを漁るという不毛な作業が必要になります。
ログファイルには『文字化けしている文章(行)』と『文字化けした未対応の文字』を出力するといいでしょう。

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