TextMeshPro対応プラグイン(宴3までのログ)


宴3までのTextMesh対応のための拡張プログラインのドキュメントのログです。
宴4では宴本体に吸収されましたので、宴4にアップデートしてください。

UnityにはTextMeshProというハイクオリティなテキスト描画機能があります。
宴でも、この機能に対応を始めました。

宴のTextMeshPro対応パッケージのダウンロード

宴3.11.9以上必須。Unity2019.3以上必須です。
宴のTextMeshPro対応パッケージのダウンロードはここから

更新履歴

Version0.3 2023/03/29

・テキストタグの解析の拡張を可能なようにアップデート

Version0.2 2019/10/07

・NameTextやバックログにタグが反映されなくなっていたのを修正
・pivotの設定によってルビの表示位置がずれるのを修正
・エラーログ出力関係を修正

Version0.1 2019/09/06

β版公開

サンプルのライセンスについて

サンプルで使っているフォントは、Google Noto Fontと、それから作成したSDFファイルです。
「Google Noto Font」のライセンスは、SIL Open Font Licenseに準拠します。

TextMeshPro対応パッケージの使い方

宴をTextMeshProに対応するには、以下の手順が必要になります。

・AdvEngineにTextMeshProに対応したシナリオテキストの構文解析処理を登録
・UIテキスト表示の入れかえ。NovelTextやTextコンポーネントを使用していた部分を、TextMeshProに対応したコンポーネントに入れ替え。

というのが主な内容です。詳細は下記に。

TextMeshPro自体のセットアップも終わらせておく必要があります。
TextMeshProの初回セットアップが終わっていない場合、下記のコンソールが表示されますので、「Import TMP Essentials」をインポートして初回セットアップを終わらせてください。
すでにTextMeshPro導入済みの場合は、プロジェクト設定の違い(使用するデフォルトアセット名など)により、サンプルの一部が動作しないかと思いますが、それはTextMeshPro公式の各種サンプルと同様です。

TextMeshPro自体の解説は、公式サイトなどでご確認ください。
TextMeshPro公式ドキュメント
Unity公式ブログ Unity 2018 で TextMesh Pro を最大限に活用しよう
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす

1 AdvEngine

AdvEnginオブジェクトに、UtageForTextMeshProコンポーネントをAddComponentします。
UtageForTextMeshProは、シナリオのテキストの構文解析をTextMeshPro対応にカスタムするためのコンポーネントです。

2 メッセージウィンドウ

MessageText

MessageTextをTextMeshPro対応にします。
「UguiNovelText」「UguiNovelTextGenerator」「UguiRichOutline」コンポーネントを削除します。
宴の「TextMeshProNovelText」をAddComponentし、TextMeshPro公式の「TexthMeshProUGUI」をAddComponentします。

TexthMeshProUGUIコンポーネントの各要素はTextMeshProの仕様に沿って設定します。
「Font Asset」は自分が用意したフォント
「Material Preset」はアウトラインなども含めた描画マテリアルの設定
「Font Size」でフォントのサイズ
「Spcaing」の「Character」文字間、「Line」で行間
AligntMentで文字の上詰めや左詰めなどが設定できます。
詳しくは、TextMeshProのドキュメントなどで確認してください。

NameText

NameTextをTextMeshPro対応にします。
MessageTextと同様に、「UguiNovelText」「UguiNovelTextGenerator」「UguiRichOutline」コンポーネントを削除し、
宴の「TextMeshProNovelText」をAddComponentし、TextMeshPro公式の「TexthMeshProUGUI」をAddComponentします。
TexthMeshProUGUIコンポーネントの各要素(フォントアセットなど)も同様に設定します。

BackLogButton-Label

バックログを開くボタンのテキスト表示部分です。
プログラムからの参照はなく、テキストを表示しているだけのものですがこれは標準Textコンポーネントなので、必要に応じてTextMeshProに変えます。

MessageWindow

「AdvUguiMessageWindow」コンポーネントを削除し、「AdvUguiMessageWindowTMP」をAddComponentします。
AdvUguiMessageWindowTMPの各要素を設定します。

3 選択肢

選択肢は、プレハブ化されているのでプレハブのほうを編集します。

labelオブジェクト

これまでと同様に「UguiNovelText」「UguiNovelTextGenerator」「UguiRichOutline」コンポーネントなどを削除し、
宴の「TextMeshProNovelText」をAddComponentし、TextMeshPro公式の「TexthMeshProUGUI」をAddComponentします。
TexthMeshProUGUIコンポーネントの各要素(フォントアセットなど)も同様に設定します。

SelectionItem

SelectionItem オブジェクトの、「AdvUguiSelection」コンポーネントを削除し、「AdvUguiSelectionTMP」をAddComponentして入れ替えます。
「AdvUguiSelectionTMP」の各要素を設定します。

4 バックログ

バックログも、プレハブ化されているのでプレハブのほうを編集します。

nameとtextオブジェクト

nameとtextオブジェクトのテキスト表示コンポーネントを、これまでと同様にTextMeshPro版にします。
これまでと同様に「UguiNovelText」「UguiNovelTextGenerator」「UguiRichOutline」コンポーネントなどを削除し、
宴の「TextMeshProNovelText」をAddComponentし、TextMeshPro公式の「TexthMeshProUGUI」をAddComponentします。
TexthMeshProUGUIコンポーネントの各要素(フォントアセットなど)も同様に設定します。

BackLogItem

BackLogItem オブジェクトの、「AdvUguiBacklog」コンポーネントを削除し、「AdvUguiBacklogTMP」をAddComponentして入れ替えます。
「AdbvUguiBacklogTMP」の各要素を設定します。

バックログを閉じるボタン

プログラムからの参照はなく、テキストを表示しているだけのものですが以下のオブジェクトも標準Textコンポーネントなので、必要に応じてTextMeshProに変えます。
AdvEngine>UI>BackLog>CloseButton>Label

5 ルビの対応

ルビ用のプレハブを作成します。
TextMeshPro公式の「TextMeshProUGUI」をAddComponetしたルビ用のテキストオブジェクトを作成しフォントファイルやマテリアル、フォントサイズなどを設定し
宴の「TextMeshProRuby」コンポーネントをAddComponetします。
TextMeshProRubyは、OffsetYでルビを表示する際のY座標の調整ができます。
さらに、これをプレハブ化します。

このプレハブを、メッセージウィンドウやバックログのプレハブに設定した「TextMeshProNovelText」コンポーネントの「RubyPrefab」に設定します。
選択肢のプレハブにもルビの表示が必要であれば設定します。

その他のUI

会話シーンとして作った場合には生成されない、ノベルゲームとして必要なUIに関しては、従来のUnity標準のTextコンポーネントのままです。
つまり、タイトル画面やギャラリー画面、コンフィグ画面、セーブロード画面、スキップなどのメニューボタン、デバッグメニューなどは従来のUnity標準のTextコンポーネントを使う形のままです。
これらは宴の特有のタグなどをそもそも使用していない(NovelTextを使っていない)こともあり、全対応してメンテナンスを続けていくほどの需要があるのかわからないため、基本的には非対応です。
ただ、後述の[「UnityデフォルトのText機能との併用のハードル」]()にあるとおり、若干のデメリットもありますので、その点はご注意ください。

タグについて

TextMeshProのタグは、ほぼそのまま使用可能です。pageタグだけは、宴の改ページ処理などと矛盾するためサポートしていません。
従来の宴のタグは基本的には使用可能ですが、詳細は下記に

タグ名 説明 対応状況
TextMeshProのタグ TextMeshProのタグ TextMeshProのタグはほぼそのまま使用可能です。pageタグだけは、宴の改ページ処理などと矛盾するためサポートしていません。
ruby ルビ 使用可能。ルビのプレハブ設定を忘れずに
em 傍点 使用可能。ルビのプレハブ設定を忘れずに
dash 傍線 対応が不完全。今後仕様変更か廃止をするかもしれません。
TextMeshPro自体には同様の機能がなく、似たような機能である「s」(取り消し線)タグを使って機能を代替しています。ただし、TextMeshProの「s」タグは、テキストの末端で機能しないほか、文字送りをした際に若干の不具合(線が現在表示している1文字先まで伸びている)があるため、その点はご注意ください。
param パラメーター表示 使用可能
format フォーマット書式付きのパラメーター表示 使用可能
speed 文字の速度指定 使用可能
emoji 絵文字の表示 使用可能。内部でTextMeshProのspriteタグに置き換えているので、絵文字ファイルの設定はTextMeshProのほうで設定すること
group グループ文字 使用可能。内部でTextMeshProのnobrタグに置き換えている
strike 取り消し線 使用可能。内部でTextMeshProのsタグに置き換えている
tips TIPSタグ 使用不可。元から特殊な調整が必要な機能だったため非対応です。TextMeshProの「link」タグなどで独自に実装してください。
その他のタグ その他の宴のタグ 使用可能。TextMeshProとほぼ共通なのでそのまま使用している

emoji、group、strikeは、過去の互換性を維持するために宴の書き方でも動くようにしていますが、なるべくなら汎用性もあるTextMeshProのタグ使うことを推奨します。

その他の設定

宴で設定してあったTextSettings機能は全てTextMeshProの機能として設定しなおす必要があります。
禁則文字の設定などは、おそらくTextMeshPro標準のままでもさほど違いはないと思いますが、宴の標準とは若干の違いがあります。
また、宴の絵文字の設定についても、TextMeshProの機能を使って準備してください。
設定方法に関しては、TextMeshProのドキュメントをご確認ください。
TextMeshProの機能で対応できないものがあった場合、残念ながら宴側を拡張しても対応できないかと思います。

メリットとデメリット

TextMeshProに対応することのメリットとデメリットのうち、特に宴を使う場合に影響がある部分をまとめました。

メリット

高解像度な端末でも劣化せずに描画ができる

従来の宴のNovelTextはプロジェクトの指定した解像度よりも高解像度の端末で実行した場合、Textが拡大表示されて引き延ばされてボヤけてみえてしまうという欠点がありました。
TextMeshProは高解像度な端末でも、劣化せずにハイクオリティな表示ができます。

描画速度の向上

従来の宴のNovelTextはやUnity標準のTextコンポーネントは、アウトラインや影を表示する場合に高負荷がかかり、特に文字送りなどして描画するテキストを変化させているときには顕著にパフォーマンスが落ちるという欠点がありました。
TextMeshProでは、アウトラインや影の描画を高速にできます。

豊富な表現力

マテリアルやシェーダーを調整することで、テキストの装飾をハイクオリティにできます。
さらに、テキストの途中でフォントやマテリアルを切り替えることができるため、1ページ内であってもテキストを色々な形式で表示することができます。

デメリット

あらかじめ決められた文字しか表示できない

TextMeshProは、SDF形式のフォントを作ってそれを利用する必要があります。
SDF形式は、あらかじめ指定された文字しか扱えないため、そこで指定されていない文字は文字化けして表示されます。
つまり、従来の標準テキストで使うことができたTTFファイルなどよりも、扱える文字の種類に制限があります。
扱う文字数が多いとデータサイズが膨れ上がってしまうため、自分のプロジェクトで採用する文字を決めて、その範囲内でテキストを書く必要があります。
用意した文字以外は表示できないので、ユーザーの任意入力の文字を表示する場合は、文字化けする可能性があります。
他にも、中国語など文字の種類が多いケースや、日本語であってもマイナーな文字を使う場合は注意が必要です。
実際にどの文字を使かうように指定するかですが、日本語ですと第一水準や第二水準などある程度の標準がありますので、それを参考にするのも良いかと思います。
宴のTextMeshPro対応のサンプルプロジェクトでは、SDFファイル作成時に使った使用する文字のリストをテキストファイル(CharacterFile.txt)として用意してありますので、それを使っても良いかと思います。
また、TextMeshProのアップデート予定では、「Dynamic SDF System」という、TTFファイルやOS内のフォントから任意の文字情報を拾ってきてSDFデータを動的に生成することが可能になる・・・という話もあるので、それが実用可能な段階になればこの点は気にしなくてよいかもしれません。
「Dynamic SDF System」は、TextMeshProのVersion1.4.1の時点では、TTFファイルの設定は可能なようです。ただ、Arialを設定しても日本語表示ができないことからOSのシステムフォントを拾ってくることはまだできていないようです。
ほかにも、どうもエディタ実行中では生成したデータをCharacterTblに追加していってるなので、仕様が今一つはっきりしないです。

UnityデフォルトのText機能との併用のハードル

TextMeshProは、UnityデフォルトのTextコンポーネント(およびそれを継承している宴の従来のNovelText機能)で使用しているフォント(TTF)とは別の形式のフォント(SDF)が必要になります。
そのため両方を入れてしまうとアプリのファイルサイズや、使用するメモリが増えてしまうという問題があります。
これを避けるには標準のTextコンポーネントを一切使わずに、全てTextMeshPro機能を使う必要があります。
ただし、「標準のTextコンポーネントを一切使わない」というのは簡単にはいきません。
TextMeshProとTextコンポーネントは、プログラム的には継承関係にもなっておらず共通するインターフェースなども持たないため、Textコンポーネントを使っているプログラムを全てTextMeshPro対応に作り直し、さらにすべてのシーンやプレハブをTextMeshPro版に修正する必要があります。
これはかなり作業負荷が高く、実質二重管理のままメンテナンスし続けるというのは非現実的なレベルです。
宴のTextMeshPro対応は先述したように全てのUIコンポーネントを対応しているわけではありません。
ただ、消費アプリサイズや使用メモリをシビアに節約する必要がないのであれば併用しても問題はないと思われます。
宴のUI部分は本体と独立しているため、どうしても既存のTextコンポーネントを排除したい場合は、フルスクラッチで自作コンポーネントに差し替えてください。

不具合報告について

宴のTextMeshProは現在のところβ版です。
不具合や、顕著なパフォーマンス低下などがありましたら、改善していきますのでQ&Aにご報告ください。
ただし、TextMeshProの使い方そのものについては答えられません。
TextMeshProのタグの詳細や、TextMeshPro用のフォントの作り方などは宴のサイトやQ&Aでは説明できません。
冒頭にあるUnity公式からの情報のほかに、日本語でも有志の解説サイトなどにすでにたくさん情報があるのでそれを調べるか、TextMeshProの公式サイトやUnity公式にお問い合わせください。
特にTextMeshProのタグの記述に関連する不具合など(たとえば絵文字が表示されないとか、フォント指定ができないなど)は、Q&Aへの不具合報告をする前に通常のTextMeshProでも起きるか確認してください。
TextMeshPro自体の不具合や使い方の間違いなのか、宴を使っているときのみ起きる不具合なのかを必ず確認し、宴が原因で起きる不具合であることを確認してからお問い合わせください。

今後について

今後は動作を安定化させていき、正式版として公開を目指そうと思います。
正式版はおそらく有料になり、宴の本体とは別のアセットとしてAssetStoreなどで販売する形になるかと思います。
ただ、TextMeshProとUnity、そして宴のそれぞれのバージョンの違いに互換性を持たせていくのがかなり難しそうなので、
AssetStoreではなく、もっと規約の緩い場所でバージョンを絞って公開するかもしれません。

また、タイトル画面などを含めた宴のUIをTextMeshProに対応するかは今後も未定です。
二重管理を避けて両対応を目指すのであれば、UI構成自体を別に作り直すレベルになるかもしれないため、需要の大きさに応じて検討していこうと思います。

その他の機能としては
・上記の入れ替え手順の自動化ツール
・宴のシナリオ内で使っている文字を全て収集する機能
・用意されていない文字を使った場合にインポート時にエラーメッセージを出す機能
なども需要の大きさに応じて対応しようかと思います。