アジア圏のゲームでTextMeshProをどう扱うか - 中国語で文字種類が多すぎる問題への対処
uGUIのテキスとTextMeshProの比較
フォントアトラスをプライマリとフォールバックに分ける。
プライマリは事前生成。フォールバックは動的生成。
フォーラムで説明している中国語の例
プライマリは、プロジェクトに含まれている既知のすべての文字列で生成する。UIパーツで使用される文字や、ゲーム内で使われる専門用語、物語・会話パートの台本などは別途システムで管理されているはずなので、そこから使用されている文字列を抽出して生成しておく。アウトライン設定などを考えて設定値を考える。
次に、それ以外のユーザー入力に対応するためのアトラスを用意する。良く使われる中国語の文字セットは、8105字。さらにレベル別に3500, 3000, 1605に分かれている。これに応じて3つのフォールバックアトラスを用意する。それぞれ、プライマリで既に含まれているものは除外する。(※ ここskipして、プライマリ以外は動的でも良いのかも。少しでも描画パフォーマンスを上げたければココは必要。ただ使用メモリと、事前準備の工数は多くなる。)
残りの漢字は動的生成。これにより全ての文字を事前用意する必要は無くなる。チャットではユーザーが手で文字を打つため、パフォーマンスの劣化に気づかれにくい
それぞれに設定を変える。使用頻度が低いものになるにつれ、設定を抑えめにしてメモリ消費を小さくする。
ユーザー名は常に使いそうなので、動的生成アトラスを分けて用意しておきたい。(可能なのか検証必要)
実際は8105種類の文字が一気に一つの画面に描画される事は無いはず。チャットページはページングの仕様として、1ページ表示するごとにダイナミックフォントのアトラスをリセットすれば問題にはならないはず
日本語で考えると、下記3段階でfont atlasを設定する。
1. プライマリ (デザインが重要な箇所と、そうで無い箇所で分けても良いかもしれない)
2. JIS第1水準漢字の残りの漢字をfallbackとして生成しておく (ここはskipして良いかも)
3. 残りは動的生成
ゲーム内で使用される文字の管理方法
UIに使われる文字は、配置したパーツにベタ打ちではなく外部テキストにて管理される。そのデータを使用してアトラスを生成する
会話、物語パートは台本ベース
ゲーム内用語はマスターデータから
フォーラムの回答訳
https://forum.unity.com/threads/creating-asset-from-font-with-a-lot-of-characters.540842/#post-3566021
code:訳
フォントファイルからすべての文字を追加するのは非常に効率的ではありません。
ローカリゼーションを処理する最も簡単な方法は(現在のところ)、プロジェクトで使用されている既知のキャラクタをすべて含んだ Primaryフォントアセットを作成することです。
ラテン語をベースにした言語の場合は、その文字セットが限られているため、拡張 ASCII をすべて含むプライマリフォントアセットを作成することができます。次に、キリル文字やギリシャ文字、その他の潜在的なサブセットを含む追加のフォント アセットをいくつか作成し、それらをラテン言語用のプライマリのフォールバックとして割り当てます。
欧文言語の場合は(選択するフォントにもよりますが)、サンプリングポイントサイズを72、パディングを8にすると、通常は見栄えの良いフォントになります。
日中韓の場合は、日中韓の文字セットははるかに大きいので、それぞれのプライマリフォントアセットを作成して、それぞれのプライマリに対していくつかのフォールバックを持つことになります。
例えば中国語の場合、プライマリは、プロジェクトに含まれている既知のすべての中国語キャラクタを内容とします。次に、ユーザー入力から来る可能性のある未知の文字については、一般的な標準中国語文字の表に定義されている残りの 8105 文字を含む 3 つのフォールバックフォント アセットを追加で作成します。その結果、最初のフォールバックには、リストから 3500 キ ャ ラ ク タ が含まれていますが、それらのキャラクタは既にプライマリに含まれているものを除いたものになります。2番目のフォールバックは、次の3000文字から再びプライマリにあるものを差し引いたものが含まれ、最後に3番目の残りの1605文字からプライマリにあるものを差し引いたものが含まれます。
東アジアの文字については、36から48のサンプリングポイントサイズは、実際には4から5のパディング値でかなり良いです。パディングは、サンプリングポイントサイズの約10%に保つようにしてください。
プライマリとフォールバックのフォントアセットを作成する際には、それらが同じサンプリングポイントサイズとパディングを使用している必要はないことに留意してください。つまり、プライマリは高品質でサンプリングして(これらの文字がプロジェクトや UI、メニューに含まれていることがわかっているので)、フォールバックには低品質のものを使用することができます。
唯一重要なのは、プライマリとフォールバックのパディングに対するサンプリングポイントサイズの比率を同じに保つことです。例えば、プライマリが80のサンプリングポイントサイズと8のパディングを使用している場合、フォールバックは50のサンプリングポイントサイズと5のパディングを使用することができます。同じ比率を維持することで、マテリアル プリセットを使用する際のスタイリング(アウトライン、シャドウなど)に関して、プライマリとフォールバックの間で同じ視覚的外観を確保することができます。
code:訳
私は確かにこれがあなたが望んでいたよりも複雑であることを理解していますが、ゲーム開発の多くの側面のように、効率的なジオメトリ/トポロジーやモデルのUVマッピングを作成したり、NavMeshesesやLightmapsをベイクしたりして、求める視覚的な結果やパフォーマンスを達成しなければなりませんが、テキストについても同じことが言えます。
以上のようなことを言ってきましたが、ハイブリッドダイナミックSDFシステムは、このプロセスをはるかにシンプルにしてくれるでしょう。推奨されるワークフローとしては、各言語または言語セットごとにプロジェクト内で既知/使用されているすべての文字を含むプライマリフォントアセットを作成しますが、実行時にプライマリフォントアセットや他のフォールバックフォントアセットに含まれていない文字を追加できるフォールバックフォントアセット(ダイナミックモードに設定)を使用することができます。
これは、大多数の文字がすでにプライマリおよび既存のフォールバックに組み込まれているため、最高の品質とパフォーマンスを提供する一方で、未知の文字やユーザーの入力に由来する少数の文字についてはダイナミックシステムに頼ることができるという考えです。
プライマリ・フォールバックにおけるアトラス設定のポイント
重要なのは、プライマリとフォールバックのパディングに対するサンプリングポイントサイズの比率を同じに保つことです。例えば、プライマリが80のサンプリングポイントサイズと8のパディングを使用している場合、フォールバックは50のサンプリングポイントサイズと5のパディングを使用することができます。同じ比率を維持することで、マテリアル プリセットを使用する際のスタイリング(アウトライン、シャドウなど)に関して、プライマリとフォールバックの間で同じ視覚的外観を確保することができます。
TextMeshProのアトラス設定について比較検証
TextMeshPro - Sampling Poins Size比較
他に考えられる方法
全部動的生成
動的なためにパフォーマンスに影響する
最初に設定していたtexture atlasの上限サイズをオーバーすると、描画できない
それを避けるなら、atlas作り直し処理を時前で用意する必要あり
ゲームで動的に使用している文字列を全部自分たちで管理する必要あり
画面内のtextMeshProコンポーネントを全部管理、text propertyを調べて、その文字列でアトラスを作りなおすとか?
"UI上のデザイン文字" と "チャット欄の文字" は同じクオリティで設定する必要がない。分けたほうが適切
使用メモリについて
テクスチャ使用メモリの計算方法
https://gyazo.com/3301d817cfa2ddac3d1eff83b3c0f0b9
フォールバックに指定したアトラスは、常にメモリに載っている
ダイナミックが含まれるかどうかに関わらず、fontファイルは常にメモリに載っている
staticしか使わない時にメモリに載せたくない場合、fontファイルを削除すれば載らない
日本語
https://www.kanjifumi.jp/keyword/jis-dai1suijunkanji/#:~:text=日本工業規格(JIS)で,漢字集合」と言います。
JIS第一水準漢字は2965字
中国語
良く使われる中国語の文字セットがある。
良く使われる中国語の文字セットは、8105字
TextMesh Pro - Chinese font problems - Unity Forum
中国語には60,000以上の文字が含まれています。しかし、結局のところ、実際に電子通信で発見されたのは約8105人だけです。これは、一般的な標準漢字のリストとして知られています。これらは、本当に集中する必要がある唯一の漢字です。
Table of General Standard Chinese Characters
8105字は、さらに3つのレベルに分かれている
レベル1は3500文字
レベル2は3000文字
レベル3は1605文字
code:中国語の文字レベル
一般標準中国語文字表(通用规范汉字表;Tōngyòng Guīfàn Hànzì Biǎo)は、簡体字(および不変字)8105字の標準リストである。このリストは2013年後半に中華人民共和国国務院によって発行された。文字は3つのレベルに分かれており、それぞれ3500文字、3000文字、1605文字が含まれています。グループ1とグループ2の文字(最初の6500文字)は共通文字として指定されています。
実際は8105種類の文字が一気に一つの画面に描画される事はほぼ無い。
一画面ごとにダイナミックフォントのアトラスをリセットすれば問題にはならないはず。
レベル1〜3の文字リスト
https://gist.github.com/z-rui/4cb3431f2bcf26ea39cd569a58e66003/
textMeshPro
performance