Unityで会話テキストやメニューを作成していると、日本語を入力したはずなのに、画面上では「□□□□」と四角く文字化けした状態で表示されることがあります。

初めて見ると文字化けやプログラムの不具合を疑ってしまいますが、多くの場合、原因はそれほど複雑ではありません。

TextMesh Proに設定されているフォントアセットに、日本語の文字データが含まれていないことが主な原因です。

この記事では、Unity初心者の方に向けて、日本語が「□」になる理由と、Noto Sans JPを使って正しく表示する方法を順番に解説します。

Unityで日本語が「□」になる原因

TextMesh Proは、設定されている「TMP Font Asset」の中から、画面に表示する文字を探します。

ところが、TextMesh Proで初期設定されていることが多い「LiberationSans SDF」などのフォントアセットには、基本的に日本語の文字が収録されていません。

そのため、ひらがなや漢字を入力しても対応する文字が見つからず、代わりに「□」が表示されます。

たとえば、UnityのConsoleには次のような警告が表示されることがあります。

The character with Unicode value \u3053 was not found in the [LiberationSans SDF] font asset.
It was replaced by \u25A1.

この警告は、次のような意味です。

  • Unicode値「\u3053」に該当する「こ」がフォントアセット内に見つからなかった
  • 表示できないため、代わりに「□」を表示した

つまり、入力した日本語やスクリプトに問題があるのではなく、使用しているフォントが日本語に対応していない状態です。

解決するには、日本語を収録したフォントからTextMesh Pro用のFont Assetを作成し、日本語を表示するテキストに設定します。

日本語フォントにはNoto Sans JPがおすすめ

Unityで日本語を表示するためのフォントとして使いやすいのが、Google Fontsで配布されている「Noto Sans JP」です。

Noto Sans JPは、ひらがな、カタカナ、漢字を幅広く収録した日本語対応のサンセリフ体フォントです。文字の形がすっきりしているため、会話文や説明文だけでなく、ボタンやメニューなどのUIにも利用できます。

主な特徴は次のとおりです。

  • 日本語の収録文字数が多い
  • 小さな文字でも比較的読みやすい
  • ゲームの会話文やUIに合わせやすい
  • Google Fontsから入手できる
  • 複数の太さを使い分けられる

今回は、実際に日本語表示を確認できた次のフォントファイルを使用します。

NotoSansJP-VariableFont_wght.ttf

配布されるファイル名や構成は、ダウンロードする時期によって異なる場合があります。

Noto Sans JPをダウンロードする

最初に、Google FontsからNoto Sans JPを入手します。

Google Fontsで「Noto Sans JP」と検索し、公式の配布ページを開いてください。ページ内のダウンロード操作から、フォントファイルを含むZIPファイルを保存します。

https://fonts.google.com/noto/specimen/Noto+Sans+JP

Screenshot

ダウンロードが完了したら、ZIPファイルを解凍します。

解凍したフォルダには、ひとつのファイルで複数の太さに対応するVariable Fontや、太さごとに分かれたフォントが入っている場合があります。

複数のファイルがある場合は、用途に応じて次のように選ぶと分かりやすいでしょう。

  • 通常の会話文や説明文:Regular
  • ボタンや視認性を高めたい文字:Medium
  • タイトルや見出し:Bold

最初はRegularまたはVariable Fontをひとつ導入するだけでも問題ありません。

Noto Sans JPをUnityに読み込む

フォントをダウンロードしたら、Unityプロジェクトへ追加します。

Projectウィンドウで、Assetsフォルダの中に「Fonts」フォルダを作成してください。

Assets
└── Fonts

続いて、ダウンロードして解凍した「.ttf」または「.otf」形式のフォントファイルを、Assets/Fontsフォルダへドラッグ&ドロップします。

今回の例では、次のような配置になります。

Assets
└── Fonts
└── NotoSansJP-VariableFont_wght.ttf

Assetsフォルダ内に配置すると、Unityがフォントファイルを自動的にインポートします。

ただし、フォントファイルをUnityへ入れただけでは、TextMesh Proのテキストにはまだ使用できません。次に、TextMesh Pro用のFont Assetを作成します。

TextMesh Proの基本リソースを導入する

TextMesh Proを初めて使用するプロジェクトでは、必要な基本リソースがまだ導入されていないことがあります。

TextMesh Proに関するメニューや設定項目が見当たらない場合は、Unity上部のメニューから次の項目を選択してください。

Window
→ TextMeshPro
→ Import TMP Essential Resources

確認画面が表示されたら、TextMesh Proの基本リソースをインポートします。

すでにTextMesh Proを使用しており、TextMeshProUGUIコンポーネントなどが正常に動作している場合は、この作業を改めて行う必要はありません。

Noto Sans JPからTMP Font Assetを作成する

Projectウィンドウで、先ほど追加したNoto Sans JPのフォントファイルを選択します。

選択した状態で右クリックし、次の項目を選びます。

Create
→ TextMeshPro
→ Font Asset

UnityやTextMesh Proのバージョンによっては、次のように「SDF」と表示される場合もあります。

Create
→ TextMeshPro
→ Font Asset
→ SDF

メニューの表記が多少異なっていても、TextMesh Pro用のSDF Font Assetを作成する項目を選べば問題ありません。

Font AssetにはSDF以外の形式が表示されることもありますが、通常の会話文やUIに使用する場合は、基本的にSDFを選択します。

SDFには、文字を拡大・縮小しても輪郭が崩れにくく、アウトラインや影などの表現を加えやすいという利点があります。

生成されたFont Assetには、たとえば次のような名前を付けておくと管理しやすくなります。

NotoSansJP-VariableFont_wght SDF

Atlas Population ModeをDynamicに変更する

作成されたFont AssetをProjectウィンドウで選択し、Inspectorを確認します。

Inspector内にある「Atlas Population Mode」を、次の設定へ変更してください。

Atlas Population Mode:Dynamic

この設定は、日本語を扱ううえで特に重要です。

日本語には、ひらがなやカタカナに加えて非常に多くの漢字があります。すべての文字をあらかじめひとつのアトラスへ収録しようとすると、データ量が大きくなったり、必要な文字が入り切らなかったりすることがあります。

Dynamicに設定すると、ゲーム内で使用された文字が必要に応じてフォントアトラスへ追加されます。

そのため、会話文や選択肢など、多くの日本語を使用するノベルゲームでは、Dynamic設定が扱いやすいでしょう。

TextMesh Proのテキストにフォントを設定する

Font Assetを作成したら、日本語を表示したいTextMesh Proのオブジェクトへ設定します。

Hierarchyで、対象のテキストオブジェクトを選択してください。

ノベルゲームの場合は、次のようなオブジェクトが対象になります。

Canvas
└── TextPanel
├── NameText
└── BodyText

NameTextを選択し、InspectorのTextMeshProUGUIコンポーネントを確認します。

「Font Asset」の欄に、先ほど作成したNoto Sans JPのFont Assetをドラッグ&ドロップしてください。

BodyTextにも、同じFont Assetを設定します。

NameText
Font Asset:NotoSansJP-VariableFont_wght SDF

BodyText
Font Asset:NotoSansJP-VariableFont_wght SDF

日本語を表示するTextMesh Proオブジェクトがほかにもある場合は、それぞれ同じように差し替えます。

元の「LiberationSans SDF」が設定されたままでは、日本語は正しく表示されないため注意してください。

日本語が表示されるか確認する

Font Assetを設定したら、TextMeshProUGUIコンポーネントのテキスト欄に日本語を入力します。

たとえば、次のような文章で確認できます。

こんにちは、Unity!
ここはどこ?
日本語フォントの表示テストです。

GameビューまたはSceneビューで、入力した日本語が「□」ではなく正常に表示されていれば設定完了です。

実際の会話文をスクリプトやScriptableObjectから読み込んでいる場合は、ゲームを再生し、該当する文章が表示されるところまで進めて確認してください。

日本語が表示されない場合の確認ポイント

Noto Sans JPを導入しても、日本語や一部の記号が「□」になることがあります。その場合は、次の項目を確認します。

元のフォントファイルを設定していないか

TextMesh Proの「Font Asset」欄には、ダウンロードした「.ttf」ファイルを直接設定するのではなく、そこから作成したTMP Font Assetを設定します。

正しく設定されている例は次のとおりです。

NotoSansJP-VariableFont_wght SDF

元のフォントファイルとFont Assetは別のものなので、取り違えないようにしましょう。

Atlas Population ModeがStaticになっていないか

Font Assetの「Atlas Population Mode」がStaticになっている場合、最初に生成したアトラスに含まれていない文字は表示できません。

日本語を継続的に追加するゲームでは、Dynamicへ変更されているか確認してください。

表示したい文字が元のフォントに収録されているか

Dynamicに設定していても、元のフォント自体に収録されていない文字は表示できません。

通常のひらがな、カタカナ、漢字はNoto Sans JPで広くカバーできますが、特殊な記号、装飾文字、絵文字などは収録されていない場合があります。

Fallback Font Assetsを設定する

特定の記号だけが表示されない場合は、Font AssetのInspectorにある「Fallback Font Assets」を利用できます。

Fallback Font Assetsに別のフォントアセットを登録すると、現在のフォントに存在しない文字を、別のフォントから探して補完できます。

たとえば、本文にはNoto Sans JPを使用し、特殊記号を収録したフォントをFallbackとして設定する方法があります。

ただし、Fallbackを増やしすぎると管理が複雑になるため、必要な文字が明確な場合に利用するとよいでしょう。

TextMesh Proの基本リソースを確認する

TextMesh Proが正しく動作していない場合は、TMP Essential Resourcesが導入されているか確認します。

Window
→ TextMeshPro
→ Import TMP Essential Resources

すでに導入済みの場合は、重ねてインポートする必要はありません。

Font Asset Creatorを使って作成する方法

Font Assetは、右クリックメニューだけでなく「Font Asset Creator」から作成することもできます。

Unity上部のメニューから、次の項目を開きます。

Window
→ TextMesh Pro
→ Font Asset Creator

「Source Font File」にNoto Sans JPのフォントファイルを設定し、フォントアトラスを生成してから保存します。

Font Asset Creatorでは、アトラスのサイズや収録する文字などを細かく指定できます。

ただし、日本語は収録文字数が多いため、初心者の段階で大量の漢字をひとつずつ指定する方法は、設定や管理が複雑になりがちです。

まずは右クリックメニューからFont Assetを作成し、Atlas Population ModeをDynamicにする方法が分かりやすいでしょう。必要な調整が出てきた段階で、Font Asset Creatorの使用を検討しても遅くありません。

会話文やボタンでフォントの太さを使い分ける

日本語が正常に表示できるようになったら、画面内の役割に合わせてフォントの太さを変えることもできます。

たとえば、次のように使い分けると、UIにメリハリを付けやすくなります。

使用する場所太さの例特徴
会話文・説明文Regular長い文章を読みやすい
キャラクター名Medium本文と区別しやすい
ボタンMediumまたはBold小さくても認識しやすい
タイトル・見出しBold強調して見せやすい

最初から複数のFont Assetを作る必要はありません。

まずはひとつのFont Assetで日本語表示を完成させ、画面デザインを整える段階で太さの使い分けを検討すると、作業を進めやすくなります。

Consoleの警告が多すぎる場合の対処

日本語に対応していないフォントを使用していると、文字が表示されるたびにConsoleへ警告が記録されることがあります。

警告が大量に並び、必要なエラーやログを確認しにくい場合は、Console上部にあるWarningの表示を一時的にオフにすると見やすくなります。

ただし、これは警告を非表示にしているだけで、原因を解決しているわけではありません。

日本語対応のFont Assetへ差し替えれば、フォントに関する警告は大幅に減るため、最終的にはフォント設定そのものを修正しましょう。

まとめ

Unityで日本語が「□」と表示されるのは、TextMesh Proに設定されているFont Assetへ日本語の文字が収録されていないことが主な原因です。

Noto Sans JPを使う場合は、次の手順で解決できます。

  1. Google FontsからNoto Sans JPをダウンロードする
  2. フォントファイルをAssets/Fontsへ入れる
  3. Noto Sans JPからTextMesh Pro用のFont Assetを作成する
  4. Atlas Population ModeをDynamicに変更する
  5. NameTextやBodyTextのFont Assetを差し替える
  6. 日本語を入力して表示を確認する

日本語フォントの設定は、Unity初心者がつまずきやすい作業のひとつです。

しかし、一度Font Assetを作成して正しく設定すれば、会話テキスト、メニュー、ボタン、選択肢など、ほかのUIにも同じ方法を応用できます。

日本語が「□」になったときは、入力内容やスクリプトを修正する前に、まずTextMesh ProのFont Assetを確認してみてください。