UnityでTextMeshProに日本語対応フォントを設定したにもかかわらず、一部の文字が「□」で表示され、文字化けしていることがあります。

(※日本語フォントの設定方法については、こちらの記事を参照!→https://games.halesia.jp/japaneseinputnotosansjp/

たとえば、Noto Sans JPを設定していて、これまで正常に表示されていたのに、シナリオの文章量を増やした途端、一部のカタカナや漢字だけが次のように表示されるケースです。

Unityで日本語フォントを設定したよ → Uni□□で□□語フォ□トを□定□□よ

今回、私のUnityプロジェクトでも同じ問題が発生しました。

使用していたのは日本語対応のNoto Sans JPで、TextMeshProのFont Assetも設定済みでした。
それでも一部の文字が「□」になっていましたが、TextMeshProのMulti Atlas Texturesを有効にすることで解消できました。

この記事では、実際に行った設定を初心者向けに解説します。

日本語対応フォントなのに「□」が表示される原因

Noto Sans JPのような日本語対応フォントを設定していても、必ずすべての文字が表示されるとは限りません。

理由は、TextMeshProが元のフォントファイルをそのまま画面へ表示しているわけではないためです。

TextMeshProでは、使用する文字をフォントアトラスと呼ばれる画像へ書き込み、その画像を利用して文字を表示します。

つまり、次のような関係です。

元のフォントファイル

TextMeshPro用のFont Assetを作成

使用する文字をAtlasへ格納

Atlasにある文字をゲーム画面へ表示

日本語は、ひらがな、カタカナ、漢字、記号など、使用する文字数が非常に多くなります。

短いシナリオでは問題がなくても、文章量を大幅に増やすと、1枚のAtlasへ文字が入り切らなくなることがあります。

その結果、Atlasへ追加できなかった文字が「□」として表示されることがあります。

今回発生した症状

今回の環境では、次のような状態でした。

  • Noto Sans JPを使用している
  • TextMeshProのFont Assetも設定済み
  • これまでは日本語を正常に表示できていた
  • 記号の「×」「―」「…」は表示できる
  • 一部のカタカナなどが「□」になる
  • シナリオの文章量を大幅に増やしたあとに発生した

記号だけではなく、一部のカタカナが表示できなかったため、元のフォントが日本語非対応というわけではありません。

結果として、Font AssetのAtlas容量が足りなくなっていたことが原因だと考えられます。

TextMeshProのFont Assetを選択する

まず、Projectウィンドウで現在使用しているTextMeshPro用のFont Assetを選択します。

今回使用していたFont Assetは次のものです。

NotoSansJP-VariableFont_wght SDF

元のフォントファイルではなく、名前にSDFなどが付いているTextMeshPro用Font Assetを選択してください。

Projectウィンドウでは、次のような構成になっていました。

Assets
Fonts
NotoSansJP-VariableFont_wght
NotoSansJP-VariableFont_wght SDF

NotoSansJP-VariableFont_wght SDFを選択すると、InspectorにFont Assetの設定が表示されます。

Atlas Population Modeを確認する

Inspectorを下へスクロールし、Generation Settingsを確認します。

その中に、次の項目があります。

Atlas Population Mode

日本語のように使用文字数が多く、ゲーム中に新しい文字が追加される可能性がある場合は、次の設定になっているか確認します。

Atlas Population Mode
→ Dynamic

Dynamicでは、ゲーム内で必要になった文字を、元のフォントファイルからAtlasへ追加できます。

今回のプロジェクトでは、すでにDynamicになっていました。

そのため、問題はDynamic設定ではなく、文字を追加するAtlasの枚数にありました。

Source Font Fileも確認する

同じGeneration Settings内にある、次の項目も確認します。

Source Font File

ここには、元の日本語フォントが設定されている必要があります。

今回の場合は、次のフォントが設定されていました。

NotoSansJP-VariableFont_wght

設定例は次のとおりです。

Source Font File
→ NotoSansJP-VariableFont_wght

Atlas Population Mode
→ Dynamic

Dynamicになっていても、Source Font Fileが設定されていないと、新しい文字を元フォントから追加できない可能性があります。

Multi Atlas Texturesを有効にする

今回、問題を解決できた重要な設定が次の項目です。

Multi Atlas Textures

最初は、この項目がOFFになっていました。

そこで、次のように変更しました。

Multi Atlas Textures
→ ON

チェックを入れると、確認メッセージなどが表示される場合があります。

設定を反映するため、InspectorにApplyボタンが表示された場合はクリックします。

これで、最初のAtlasへ文字が入り切らなくなったときに、新しいAtlasを自動的に追加できるようになります。

「Atlas 1」が増えても問題ない

Multi Atlas Texturesを有効にしてApplyを押すと、Projectウィンドウ内に次のようなアセットが追加されました。

NotoSansJP-VariableFont_wght Atlas 1

さらにゲームをテストプレイしていくと、次のように増えていきました。

NotoSansJP-VariableFont_wght Atlas 1
NotoSansJP-VariableFont_wght Atlas 2
NotoSansJP-VariableFont_wght Atlas 3

最初は、アセットが増え続けて大丈夫なのか不安になるかもしれません。

しかし、これは異常ではありません。

最初のAtlasへ文字が入り切らなくなったため、TextMeshProが新しいAtlasを作成して、必要な文字を追加している状態です。

日本語のように文字数が多い言語では、複数のAtlasが作られることがあります。

作成されたAtlasは、削除したり名前を変更したりせず、そのまま残しておきます。

今回直った設定

今回、日本語の一部が「□」になる問題を解消できた設定は次のとおりです。

Source Font File
→ NotoSansJP-VariableFont_wght

Atlas Population Mode
→ Dynamic

Multi Atlas Textures
→ ON

設定後にApplyを押し、ゲームを再生しました。

すると、必要に応じてAtlas 1Atlas 2Atlas 3などが追加され、それまで「□」だったカタカナや漢字も正常に表示されるようになりました。

設定後に行う確認

設定を変更したら、次の順番で確認します。

  1. Playモードを停止する
  2. Font Assetを選択する
  3. Atlas Population ModeDynamicになっているか確認する
  4. Source Font Fileに日本語フォントが設定されているか確認する
  5. Multi Atlas TexturesをONにする
  6. Applyを押す
  7. ゲームを再生する
  8. 「□」になっていた文章を表示する
  9. 新しいAtlasが追加されているか確認する

文章を進めるたびに新しい文字が使われる場合は、テストプレイ中にAtlasが追加されることがあります。

まだ「□」が表示される場合の確認事項

Multi Atlas Texturesを有効にしても直らない場合は、次の点を確認します。

TextMeshProに正しいFont Assetが設定されているか

一部の画面だけで「□」が表示される場合は、そのTextMeshProオブジェクトだけ別のFont Assetを使用している可能性があります。

たとえば、次のようなUIを個別に確認します。

シナリオなど本文表示用のBodyText
名前表示用のNameText
選択肢ボタン内のButtonText...など

それぞれのTextMeshPro - Text (UI)コンポーネントにあるFont Assetが、同じ日本語対応Font Assetになっているか確認してください。

Font Asset
→ NotoSansJP-VariableFont_wght SDF

元のフォントに文字が含まれているか

Noto Sans JPのような日本語フォントであっても、すべての特殊記号や非常に珍しい漢字を必ず収録しているとは限りません。

特定の文字だけがどうしても表示されない場合は、元フォントにその文字が含まれているか確認する必要があります。

Consoleに警告が出ていないか

文字が「□」になった直後に、UnityのConsoleを確認します。

検索欄へ次のような言葉を入力すると、文字関連の警告を探しやすくなります。

character
Unicode
Font Asset

不足している文字のUnicode番号が表示されていることもあります。

似ている別の文字が使われていないか

見た目が似ていても、内部的には別の文字として扱われる記号があります。

たとえば、横線だけでも複数の種類があります。

-  半角ハイフン
ー 長音符
― 横線
— EMダッシュ

TSVや表計算ソフトから文章を取り込んだ場合、見た目が似た別のUnicode文字へ変わっていることがあります。

特定の記号だけ表示できない場合は、一般的な文字へ置き換える方法もあります。

ビルドすれば自動的に直るとは限らない

Unity EditorのPlayモードで「□」になっている文字が、ビルド後に必ず正常になるとは限りません。

むしろ、Editor上で文字が正常に表示できていない場合は、ビルド後も「□」になる可能性があります。

そのため、ビルド前に次の状態を確認しておくことが重要です。

Unity Editor上ですべての文章が正常に表示されている

実際のシナリオを最初から最後までテストし、必要な文字を一度表示させておくと、Atlasへの文字追加も確認できます。

StaticとDynamicの違い

TextMeshProのFont Assetには、主にStaticDynamicがあります。

Static

Atlas Population Mode
→ Static

作成時に登録した文字だけを使用します。

ゲーム中に新しい文字が必要になっても、自動では追加されません。

使用する文章が完全に決まっている場合は、必要文字だけを登録して容量を管理しやすい方法です。

Dynamic

Atlas Population Mode
→ Dynamic

ゲーム中に必要となった文字を、Source Font Fileから追加できます。

シナリオを頻繁に編集する場合や、使用する日本語が増えるゲームでは扱いやすい設定です。

今回のように、NumbersやTSVでシナリオを追加していくプロジェクトでは、DynamicとMulti Atlas Texturesの組み合わせが分かりやすい方法でした。

Atlasのサイズを大きくすればよいのか

Atlas WidthやAtlas Heightを大きくすると、1枚に格納できる文字数は増えます。

今回の設定は次のとおりでした。

Atlas Width
→ 1024

Atlas Height
→ 1024

日本語では文字数が多いため、1024×1024の1枚だけでは不足することがあります。

ただし、むやみにサイズを大きくすると、使用メモリやビルド容量にも影響します。

初心者の場合は、まず次の設定で動作を確認する方法が分かりやすいです。

Atlas Population Mode
→ Dynamic

Multi Atlas Textures
→ ON

必要に応じて複数のAtlasへ分けることで、文字数の増加へ対応できます。

今回の結論

日本語対応のNoto Sans JPを設定しているのに、一部の文字が「□」になった原因は、フォント自体ではなく、TextMeshProのAtlas容量不足でした。

今回行った対応は次のとおりです。

  1. TextMeshPro用Font Assetを選択する
  2. Source Font Fileに日本語フォントが設定されていることを確認する
  3. Atlas Population ModeをDynamicにする
  4. Multi Atlas TexturesをONにする
  5. Applyを押す
  6. ゲームを再生して文字を確認する

設定後、次のようなAtlasが追加されました。

Atlas 1
Atlas 2
Atlas 3

これは文字が増えたことに応じて、TextMeshProが新しいAtlasを作成している正常な動作です。

アセットが増えても削除せず、そのまま使用します。

日本語シナリオを大量に扱うゲームで、一部の漢字やカタカナが「□」になった場合は、まずMulti Atlas Texturesが有効になっているか確認してみてください。