TextMeshPro の文字だけでなくフォントも選択言語に応じて自動的に変えるエディタ拡張【Unity Localization】

Unity Localization を用いた TextMeshPro のローカライズ機能は
デフォルトでは文字の切り替えコンポーネントしか提供されていません.
本記事では文字の切り替えだけでなくフォントも切り替えるようにし,加えて便利なエディタ拡張を実装してみた記事になります.

TextMeshPro のローカライズ

xrdnk.hateblo.jp

こちらの記事にて,Unity Localization を用いた多言語対応の実装方法について述べました.
TextMeshPro の文字を選択言語に応じて切り替えたい場合は「Localize String Event」コンポーネントを利用するのがよい感じです.
ただし,ここで一つ問題として挙がるのが「フォントアセット」問題です.
言語によってフォントのアセットは異なるはずです.

Unity Localization では TMP_FontAsset 版の「Localize XXXXX Event」コンポーネントがないので,自作する必要があります.
作りましょう.

LocalizedTmpFontEvent

Unity Localization 側では LocalizedTmpFont という TMP_FontAsset 用のLocalizedクラスが提供されています.

    /// <summary>
    /// Provides a <see cref="LocalizedAsset{TObject}"/> which you can use to localize a TextMeshPro <see cref="TMPro.TMP_FontAsset"/>.
    /// </summary>
    [Serializable]
    public class LocalizedTmpFont : LocalizedAsset<TMPro.TMP_FontAsset> {}

ただし,LocalizedTmpFontEvent コンポーネントはなぜかないので,自作します.

gist.github.com

LocalizedAssetEvent を継承すればどんな型でも理論上できると思います.
第一引数はローカライズ対応したい型,第二引数はその型のLocalizedクラス,第三引数はその型の UnityEvent って感じです.

実際に適用してみる

実際に適用してみます.
フォントアセット用のテーブルデータを作ります.

f:id:xrdnk:20220127104109p:plain

ローカライズ対象の TextMeshPro に LocalizedTmpFontEvent コンポーネントをアタッチします.

f:id:xrdnk:20220127104157p:plain

LocalizedAssetTable に該当の Table Entry を設定し, Update Asset イベントに TextMeshPro のフォントアセットを引数にして設定します.

f:id:xrdnk:20220127104351p:plain

動作確認してみると,言語が変わるとテキストだけでなくフォントアセットも変わっているのがわかります.
(エディタ上では Material Preset が変更されていないように見えますが,実際に変更されています.遅延がある感じ)

gyazo.com

エディタ拡張

TextMeshPro コンポーネントの縦三点リーダを押すと,「Localize」ボタンがありますが,
アレって Localize String Event コンポーネントをアタッチするだけでなく,
Update Asset イベントに TextMeshPro の text プロパティを自動的に設定してくれているんですよね.

せっかくなので同じような機能をエディタ拡張で実装し,「Localize Extension」ボタンを押したら,
Localize String Event だけでなく,Localized Tmp Font Event コンポーネントも自動的にアタッチさせ,
加えて,Update Asset イベントに font プロパティも設定できるようなものを作りましょう.

サンプルスクリプト

早速ですが,実装したサンプルスクリプトは以下になります.

gist.github.com

エディタ拡張を使ってみる

gyazo.com

「Localize Extension」ボタンを押すだけで,テキストのローカライズに必要なコンポーネントがアタッチされました.
後は LocalizedAssetTable の設定をするだけでよくなります.ここもできれば簡単に出来るようにしたいですね….