【Unity】TextMeshPro の Fallback を言語切替時に Addressables から読み込むパッケージの紹介

# 概要

https://blog.kyubuns.dev/entry/2021/02/06/001609

上記のきゅぶんずさんの記事に習ってフォントの動的読み込みを実装する際、以下のようなクラスが有ったら汎用的に利用できそうだと思ったので作ってみました。
- [FallbackFontRemoverEditor](https://github.com/yamara-mh/CodeStorage/blob/main/Codes/FallbackFontRemoverEditor.cs) : Play Mode 起動時やビルド時に FallbackFontAssetTable を空にするクラス
- [FallbackFontLoader](https://github.com/yamara-mh/CodeStorage/blob/main/Codes/FallbackFontLoader.cs) : Fallback の情報を代わりに保持するスクリプタブルオブジェクト
- [FallbackFontLoaderController](https://github.com/yamara-mh/CodeStorage/blob/main/Codes/FallbackFontLoaderController.cs) : 動的に Fallback の読み込みを行うコンポーネント


### 追記（2024/04/08）
上記のクラスを改修してパッケージにしました。

https://github.com/yamara-mh/TMPro_LocaleFontLoader

``` TMPro_LocaleFontLoader.json
https://github.com/yamara-mh/TMPro_LocaleFontLoader.git?path=Assets/TMPro_LocaleFontLoader
```

これより先の文章は、改修前の内容になります。

# 使い方

1. [UniRx](https://github.com/neuecc/UniRx), [UniTask](https://github.com/Cysharp/UniTask), Addressables, Localization を導入します
2. [FallbackFontRemoverEditor](https://github.com/yamara-mh/CodeStorage/blob/main/Codes/FallbackFontRemoverEditor.cs), [FallbackFontLoader](https://github.com/yamara-mh/CodeStorage/blob/main/Codes/FallbackFontLoader.cs), [FallbackFontLoaderController](https://github.com/yamara-mh/CodeStorage/blob/main/Codes/FallbackFontLoaderController.cs) を導入します
3. FallbackFontAssetTable を持つ TMP_FontAsset に対して [FallbackFontLoader の生成と設定](#fallbackfontloader)を行います
4. 開始シーンのシングルトンオブジェクトに FallbackFontLoaderController を付けます
5. FallbackFontLoaderController に常時使用するフォントを登録します
6. フォントの読み込みが完了してからタイトル画面に遷移するような実装を行います

# 各種説明

## FallbackFontLoader 

生成は```Create/ScriptableObject/Create FallbackFontLoader```から行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/bb304fb4-7163-fa29-b4fc-b2a11b7f9631.png)

|項目|説明|
|-|-|
|BaseFont|基本フォント|
|DynamicRef<br>(オプション)|ダイナミックフォントの参照|
|LanguageRefs<br>(オプション)|各言語に対応したフォントの参照<br>**アドレス末尾に言語コードが必要です。**<br>日本語フォントのアドレスの例：FontName ja|
|Refected in Base Font|BaseFont に設定されているフォントの fallbackFontAssetTable に LocalizationRefs のフォントを反映するボタンです。<br>反映する言語は Localization Settings の Project Locale Identifier に設定されている言語です。<br>Dynamic Font は変更防止のため反映しません。|
|IsLoaded|読込完了を判定するフラグ|
|static IsLoadedDefaultFonts|LoadOnStartup が有効である全フォントの読込完了を判定するフラグ|

Fallback を持つフォントに対応した FallbackFontLoader が存在しない際は、Play Mode 起動時とビルド時にエラーが出るようにしています（設定漏れ対策）。

## FallbackFontRemoverEditor

FallbackFontRemoverEditor は、空にした FallbackFontAssetTable の数をログに出力します。これは Fallback を空にする挙動を明確にして混乱を避けるためです。
また FallbackFontRemoverEditor は、UNITY_EDITOR シンボルで囲んでいるので Editor フォルダに置く必要はありません。

## FallbackFontLoaderController

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/455f54fe-e2bb-02ca-f72d-30091be11bb1.png)

|項目|説明|
|-|-|
|LinkType|Instance : Start() で読込、OnDestroy() で破棄が行われます<br>Active : OnEnable() で読込、OnDisable() で破棄が行われます<br>Manual : 手動で読込と破棄を行う必要があります|
|UpdateAllTextOnLoad|フォント読込完了後、実体を持つ TMP_Text を全取得し、フォント名が同じ TMP_Text の描画を更新して最新のフォントを反映します。|
|FallbackFontLoaders|Fallback を読み込む FallbackFontLoader|
|OnLoadedEvent|読込完了時に実行されるイベント|
|OnUnloadedEvent|破棄完了時に実行されるイベント|
|IsLoaded|読込完了を判定するフラグ|
|OnLoaded|読込完了時に発行される Observable|
|OnUnloaded|破棄完了時に発行される Observable|