TextMeshPro の文字だけでなくフォントも選択言語に応じて自動的に変えるエディタ拡張【Unity Localization】
Unity Localization を用いた TextMeshPro のローカライズ機能は デフォルトでは文字の切り替えコンポーネントしか提供されていません. 本記事では文字の切り替えだけでなくフォントも切り替えるようにし,加えて便利なエディタ拡張を実装してみた記事になります.
TextMeshPro のローカライズ
こちらの記事にて,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 コンポーネントはなぜかないので,自作します.
LocalizedAssetEvent を継承すればどんな型でも理論上できると思います. 第一引数はローカライズ対応したい型,第二引数はその型のLocalizedクラス,第三引数はその型の UnityEvent って感じです.
実際に適用してみる
実際に適用してみます. フォントアセット用のテーブルデータを作ります.
ローカライズ対象の TextMeshPro に LocalizedTmpFontEvent コンポーネントをアタッチします.
LocalizedAssetTable に該当の Table Entry を設定し, Update Asset イベントに TextMeshPro のフォントアセットを引数にして設定します.
動作確認してみると,言語が変わるとテキストだけでなくフォントアセットも変わっているのがわかります. (エディタ上では Material Preset が変更されていないように見えますが,実際に変更されています.遅延がある感じ)
エディタ拡張
TextMeshPro コンポーネントの縦三点リーダを押すと,「Localize」ボタンがありますが, アレって Localize String Event コンポーネントをアタッチするだけでなく, Update Asset イベントに TextMeshPro の text プロパティを自動的に設定してくれているんですよね.
せっかくなので同じような機能をエディタ拡張で実装し,「Localize Extension」ボタンを押したら, Localize String Event だけでなく,Localized Tmp Font Event コンポーネントも自動的にアタッチさせ, 加えて,Update Asset イベントに font プロパティも設定できるようなものを作りましょう.
サンプルスクリプト
早速ですが,実装したサンプルスクリプトは以下になります.
エディタ拡張を使ってみる
「Localize Extension」ボタンを押すだけで,テキストのローカライズに必要なコンポーネントがアタッチされました. 後は LocalizedAssetTable の設定をするだけでよくなります.ここもできれば簡単に出来るようにしたいですね….