この記事でのバージョン
Unity 2022.3.21f1
はじめに
UnityのTMP(TextMesh Pro)はFont Assetでフォントを指定するので、
言語によってフォントを変えたい場合はこれ変える必要があります。
さすがに言語分のTMPオブジェクトを作って切り替えるのは面倒ですし、
Font Assetを切り替えるコンポーネントを作っても、そのコンポーネントの付け忘れがありえます。
と言う事で今回はFont Assetを変えずに言語ごとにフォント変える方法の紹介です!
Font Assetを変えずに言語ごとにフォント変える方法
まずフォントはなんでもいいので、ベースとなるFont Asset(今回はBase SDF)を
何の文字も設定せずに作り、Staticにします。
つまり、何の文字も表示出来ないフォントアセットを作る感じで、これをTextMesh Proに設定します。
これだけだと文字を表示できないので、Font AssetのFallback Font Assetsを使います。
Fallback Font AssetsはそのFont Assetにない文字を、他のFont Assetで表示するという機能です。
つまりベースのフォントは何も表示できない→Fallback Font Assetsに設定されたフォントを使う
という流れにし、このFallback Font Assetsを言語ごとに切り替えるというイメージです。
具体的なプログラムは以下のような感じです。
/*_baseFontも_targetFontもTMP_FontAsset*/ //ベースのフォントアセットのFallback Font Assetsをリセット _baseFont.fallbackFontAssetTable.Clear(); //アトラスリセット _baseFont.ClearFontAssetData(); _targetFont.ClearFontAssetData(); //現在の言語のフォントアセットをFallback Font Assetsに設定 _baseFont.fallbackFontAssetTable.Add(_targetFont);
ちなみにFallback Font Assetsは複数設定可能なので、
例えば日本語のフォントをベースに、中国語用、韓国語用と
足りない文字のフォントアセットだけ追加していけば良さそうに見えますが、
これをやると日本語のフォントに含まれるのはそちらが使われてしまうので、
「日本にもある漢字は日本語のフォントなのに、中国の漢字は中国のフォント」
みたいな歪な感じになって、結構使うのが難しかったりりします。