宴のTextMeshPro対応


投稿日:2023年12月3日 | 最終更新日:2023年12月12日

宴4からテキスト表示とUI表示のすべてをTextMeshProで行えるようにしました。
宴3までの拡張プラグイン形式に関するドキュメントはこちらです。

TextMeshProについて

TextMeshProの公式サイト

TextMeshPro公式ドキュメントは、Unity公式ドキュメントの中にはなく、Unity公式拡張パッケージのサイトにあります。
ただし、2023年時点の正規リリースバージョンのTextMeshPro3.0のドキュメントがあまり整理されてないようです。
プレビュー版であるTextMeshPro3.2を参照するほうが良いと思います。(3.2の機能は3.0ではまだ使えないのが混じっていたりするので、その点は注意してください)

TextMeshProの歴史

TextMeshProは元々は宴と同じようにサードパーティ製のアセットストアの拡張機能だったのですが、後にUnity公式に採用され、Unity2021.2ごろからテキスト表示の標準機能になりました。
それに伴い、旧来のText表示は「Legacy Text」などと呼ばれるようになり、将来的にUnityから廃止される可能性もあるようです。

特徴

・端末が高解像の場合、テキスト表示もそれにあわせてほぼ劣化なく高精度に表示されます。
  元のサイズ
  高解像でもほぼ劣化がなく表示できます。

・描画速度が速い。(FPSを固定していないと早すぎるほどで、宴のスキップ機能などを使うと視認できないほど早くスキップされてしまうことがあります)
・アウトラインやシャドウのほか、多重アウトラインやベヘル、グラデーションなど多彩なテキスト効果を付けられる。

サロゲートペアをサポート

広く使われているデジタル文字の共通規格にUNICODEというものがあります。
UNICODEは16bitで始まったものの、全世界の文字を扱うには16bit(最大65,536)では足りないため、収まらない文字を扱うために拡張された仕組みがサロゲートペアです。
ペアとなっている2つのunicodeを一つの文字として扱う少し特殊なものです。
日本語では、(ホッケ)のような稀な漢字にも使われているほか、人名などでも使われることがあります。
従来は略字表記せざるを得なかったものも本来の漢字を表示できるようになります。

プログラム的には、サロゲートペアはstring内の「char2個で1文字となる」という形になるため、対応したプログラムをしないと文字数がズレるなどの不具合が起きたりします。
宴ではその点も考量してプログラムを更新しました。
また、Unityエディタ上ではまだサロゲートペア文字は表示できないようなので、インスペクター内やコンソールのDebugLogなどに正常に表示されないなどの不都合もあります。

TextMeshProを使うための準備

セットアップ

宴4をインポートすると、TextMeshProも自動でインポートされます。
TextMeshProをまだ使用していない場合は、セットアップ作業が必要になります。
Window > Text Mesh Pro > Import TMP Essential Resources を開いてください。


「Import TMP Essentials」をインポートして初回セットアップを終わらせてください。
すでにセットアップが終わっている場合は、ボタンがグレーアウトしています。

Color Spaceの確認

Unity2022.3前後から、UnityのデフォルトのColor SpaceがLinearに変更されたようです。

Edit > Project Settings> Player と選択していくと、 Other SettingsのRenderingにColor Spaceの設定項目があります。

ラィティングを多用する3Dモデルを表示する際には、Color SpaceがLinear前提となっていることが多いのですが、
Color SpaceがLinearになっていると、UI表示ではアルファブレンディング(半透明なものの描画)の際に従来のGammmaと違った描画結果となります。
宴のようにUI表示メインとなっているもののほか、2Dゲームやモバイルゲーム、その他UIが多くの描画を占めるゲームなどではColorSpaceを「Gamma」に設定するほうが従来通りに安定すると思います。

Color Spaceとは?

Color SpaceはUnity内部の色の計算方式のことです。詳しくはUnityの公式ドキュメント等で確認してください。
Unity公式ドキュメント:リニアのワークフローとガンマのワークフロー

LinearとGammaどっちにすべき?

Unity2021まではデフォルトのColor SpaceはGammaになっていたので、TextMeshProの表示もGammaが基本となっていると思われます。
(Unity2022.3以降でもプロジェクト作成時のテンプレートがMobile2DなどだとGammaのままのようです)
どうもLinearだと、UnityのUI表示のアルファブレンド(半透明表示)やTextMeshProの表示結果がGammaと違ってしまうようです。
ただ、この挙動自体は何年も前からそのままなので、Linearで表示が変わってしまうのがバグなのか仕様なのかが今のところはっきりしません。
Unity2022.3以降であれば、CanvasコンポーネントのVertexColorAlwaysInGammaという機能をオンにするなどの対処方法もあるようです。

ですが、その挙動もどうもまだ不安定なようですし、それで解決するのかよくわかりません。(UnityのバージョンとTextMeshProのバージョンによるのかもしれません)
テキスト表示などのUIを重視するのであれば「Gamma」に設定するほうが従来通りに安定すると思います。
詳しくはUnity側に問い合わせてください。

宴のUIコンポーネントのTextMeshPro対応

宴4から、UI系のコンポーネントをすべてTextMeshProに対応しました。
宴のUIコンポーネントで、TextMeshProに対応したものは基本的にはコンポーネント名にTMPという接尾辞がつく形になっています。
Legacy Text用のUIコンポーネント例

TextMeshPro対応のUIコンポーネント例

二つのコンポーネントの違いは操作対象のTextコンポーネントがどっちかというだけの場合がほとんどです。

宴4から、宴の新規プロジェクト作成時における基本はTextMeshPro版のほうを使うようにしてます。
宴4でも「Legacy Text」版のほうはそのまま使えるようになっていますが、
既に旧Legacy Text用のコンポーネントで作成したシーンをTextMeshPro対応にしたシーンに入れ替えるのであれば、
Text系オブジェクトを更新するだけではなく、これらのUIコンポーネントも交換するようにしてください。
参考:旧Textで作られたシーンをTextMeshPro対応する

リッチテキストタグについて

宴のシナリオでは、TextMeshProタグと宴の独自タグを使用することができます。
詳細は、テキストタグを参照してください。

宴に用意されているデフォルトのフォントアセット

宴にはNotoSansフォントから作成したTextMeshProのSDFフォントアセットが用意されていいます。
基本的には各新規プロジェクト作成時に自動的に作成されるので、あまり意識する必要はないのすが、下記のその詳細を記述します。

フォント名 対応言語 収録文字数 グローバルを除いた文字数
NotoSans グローバル(英語などのアジア圏以外) 3053 -
NotoSansJP 日本語 16732 16203
NotoSansKR 韓国語 23174 22645
NotoSansSC 簡体字(中国本土) 30890 29906
NotoSansTC 繁体字(台湾、香港) 20745 18258

*文字数は独自計測です。

元となるフォントファイル

オリジナルのフォントファイルは、GoogleのNotoSansフォントです。
Utage/Fonts/Fontsフォルダ以下に、フォントファイルとそのライセンスがあります。

SIL OPEN FONT LICENSE

フォントのライセンスは、「SIL OPEN FONT LICENSE Version 1.1」というものです。
詳細はライセンス本文を読んでください。
有償無償問わず使ってよいものですが、基本的にはライセンスの表記や著作権者の表記が必要になります。
TextMeshProでフォントアセットを作った場合にも、このライセンスの条項に従う必要があるかは解釈が分かれるのですが、表記したほうが確実だと思います。
TextMeshPro公式が使っているフォントのライセンス(LiberationSans - OFL等)と同じものですので、詳しくはUnityに問い合わせてください。

使用文字

TextMeshProのフォントアセットを作成する際に使用する文字リストは、Utage/Fonts/CharacterCollectionsフォルダ以下にあります。

NotoSansは元のフォントに収録されているすべて文字がリスト化されています。
NotoSansJP、KR、SC、TCは、各フォントに収録されているすべて文字から、NotoSansに収録されている文字を省いたものがリスト化されています。
また、NotoSansJP Character Collection_0of2、NotoSansJP Character Collection_1of2のように、設定された最大文字数で分割された文字リストファイルも同梱されていて、実際にはこちらを使っています。

NotoSansに収録されていいない文字

代表的なものだと「≒」などごく一部の文字が表示できません。
普通に使う分にはほぼすべての文字が表示できますが、もし対応できない文字を表示する必要がある場合は、対応しているフォントファイルを探してきてフォントアセットを新規作成してフォールバックなどを追加設定してみてください。
NotoSansの各フォントが、指定した文字に対応しているかは、Webサイトのタイプテスターを使うとすぐに確認できます。
宴のシナリオデータ内で使用している文字がフォントアセットに収録されているか検証する場合は、Scenario Character Validatorを使ってください。
NotoSansの各フォントに収録されている文字はすべて収録しているので、同じフォントファイルを使うのであればダイナミックフォントで文字をランタイムで作成する保険をかける必要はありません。
TextMeshProの拡張機能として、OSに収録されているフォントを取得するという仕組みも準備中のようですので、将来的にはそちらは選択肢になるかもしれません。
OSフォントの仕組みは2023年現在ではTextMeshProのプレビューバージョンでしか使えない上に不安定なようです。

TextMeshProのフォントアセット

TextMeshProのフォントアセットは「Utage/Template/Template/Fonts & Materials」以下にあります。
実際には、宴の新規プロジェクト作成時にこれをコピーしたものが作成され、各プロジェクトの/Fonts & Materials以下に作成されます。

シーン内のUIコンポーネントに設定されているのは、「プロジェクト名NotoSans0 SDF」で、基本的にはこのフォントが使用するメインのフォントになります。
実際に使用する際には、NotoSansにNotoSansJPなどの各言語の文字を組み合わせて(フォールバックして)使う形になっています。
フォールバックには、新規プロジェクト作成時に設定した「Font Langugae」に対応した言語のフォントが設定されています。

フォントのローカライズ


日本語、簡体字、繁体字、韓国語でローカライズするときは、
「海」や「食」などのように、同じUNICODEであっても言語によって表示する文字が若干異なるものも数多くあるため、
単純に各言語のフォントをすべて設定するのではなく、言語によって設定するフォントを入れ替える必要があります。
宴にはそういった仕組みを組み込んであります。
使用方法については、こちらをご確認ください。