フォントをローカライズする
これはUNITYの意味不明な仕様に全ユーザーがマジでムカついていると思いますが、とりあえず私がキレまくりながら見つけた解決方法を紹介します。
1.フォントを用意する
まずは言語ごとのフォントを用意しましょう。
GoogleFontsから探せば、種類は少ないもののさっさと終わります。
注意点として、全ての言語ごとに個別のフォントを用意する必要はありません。
どういう意味かというと、私は
日本語 英語 韓国語 インドネシア語 スワヒリ語 タガログ語 スペイン語 フランス語 ドイツ語 ロシア語 ポルトガル語 イタリア語 中国語(簡体字) 中国語(繁体字)
に翻訳していますが、
日本語 英語 インドネシア語 スワヒリ語 タガログ語
は共通の日本語フォントで事足ります。なぜなら(めちゃくちゃ特殊なフォントでない限り)日本語フォントはアルファベットを網羅しており、「英語 インドネシア語 スワヒリ語 タガログ語」はアルファベットのみで表記可能だからです。
さらに、
スペイン語 フランス語 ドイツ語 ロシア語 ポルトガル語 イタリア語
は、すべてNotoSansのBlackとかRegularとかThinなどで対応するようにすれば共通フォントでいけます。私は強調したい文字はNotoSansBlack、普通のUIの文字はRegular、セリフ文字はThinでやってます。
あとは韓国語と中国語2種類のフォントを用意すればOKです。
つまり、前述のように多くの言語をサポートする場合でも、フォントの種類は
- 日本語 英語 インドネシア語 スワヒリ語 タガログ語
- スペイン語 フランス語 ドイツ語 ロシア語 ポルトガル語 イタリア語
- 韓国語(=ハングル文字)
- 中国語(簡体字)
- 中国語(繁体字)
の5種類を用意すればOKということになります(繰り返しますが、スペイン語~イタリア語をNotoSansにする場合の話です。かっこ悪いと思うなら頑張って探しましょう)。
2.フォントを変更させるクラスを用意する
実際のコードを示します。私の環境で実際に動かしているクラスなので、あなたから見ると意味不明な参照が含まれていますが、想像で補って修正ください。
二つのクラスとEnumが必要です。
「言語の種類」と「フォントの種類」をEnumで作る
「言語の種類」をEnumで管理するのは以前の記事の範疇なので、そちらを参照してください。
さらに、「フォントの種類」もEnumで管理します。
私の場合はこのようにしています。
FontTypeの中身がフォント名のようになっていますよね。
本当は「UIのタイトル」「アイテムの説明文」などとしたほうが良いのかもしれません。なぜこのようにEnumをフォント名にしておくのかというと、
開発中は日本語とか英語で開発しますよね。なので、「アイテムの名前はScanLineという超お気に入りのフォントを使うぞ」というのはなんとなく頭に入っていると思うのです。
なので、オリジナルのフォント名にしておけば、「それと似たようなフォントを設定すればいい」ということが直感的にわかりやすいので、このようにしています。
「フォントを置換したいTMP」を検索してフォントを置換するクラス
なお、GetComponentsInActiveSceneという素晴らしいメソッドはこの記事から引用しています。便宜上クラス内に含めましたが、非常に汎用的なメソッドなのでStaticにした自作ライブラリなどに置いておくとよいでしょう。
「これはフォントを置換したいTMPだよ」と明示するためのクラス
このクラスをフォントを置換したいTMPを持つオブジェクトにインスペクターからAddComponentして、さらにインスペクターウインドウからEnumのフォントタイプを設定しておきます。しないと置換されないので注意です。
こんな感じです。
MultiAtrasをONにする
これが最もムカついた部分なのですが、例えばオリジナルのフォントファイルからFontAssetファイルを作るとき、
- プロジェクトウインドウ内でオリジナルのフォントファイルを右クリック
- Create→TextMeshPro→FontAsset
でFontAssetファイルを作りますよね。これで作られるファイルは厳密には「DynamicFontAsset」ファイルと言って、元のフォントファイルを参照する便利なファイルです。
しかし、例えば韓国語をローカライズする場合、なぜかはよくわからないのですが、NotoSansKRのような全文字が網羅されているフォントを使っても、文字によっては豆腐(□□□みたいなやつ)が発生したりします。
で、さらに意味がよくわからないのですが、この動画を参考にしてFontAssetファイルのなかのMultiAtrasにチェックを入れると、なぜかそれが直るのです。こんなことを誰が解るというのでしょうか?「そんなの公式のドキュメントの奥の奥の最深部の裏ボスを倒したその先に書かれてるじゃん」と言われたらしょうがないですが、私はわからなかったです。
とりあえず豆腐が生まれるのは嫌なので、豆腐が生まれそうなマルチバイトフォントのFontAssetファイル(または、すべてのFontAssetファイル)の「MultiAtras」にチェックを入れておきましょう。
以上です。