【Unity】AssetBundleのVariantでローカライズ
AssetBundleのVariantを使用して、ローカライズ的な事を行うアプローチについてです。
今までは少し面倒なバグのせいで紹介するのを避けてきましたが、Unity 5.4bの何処かのバージョンでバグが治ったので、使えるようになりました。
Variantでローカライズ
VariantはAssetBundleの依存関係を解決する際、参照先を切り替える技術です。
Variantに関するお話はこちら。
このVariantですが、デバイスの解像度やGPUによる違いを吸収し最適なテクスチャを適応する(ETC2対応ならETC2、ETC2非対応なら16bit color等)とかに使えますが、今回はコレをローカライズに使用します。
なお、VariantはあくまでもAssetBundleが依存関係を構築するケースで使用できます。ResourcesやBuild Settings等、ローカルからアクセスする場合には機能しません。
テクスチャやアセットの差し替え(下準備)
今回はAssetBundle Managerを使用します。
最初はテクスチャやアセットの差し替えです。
まずは各国ごとのフォルダを作成し、全て同一のAssetBundleNameを指定します(今回の場合、resとしました)
次に、variant nameを各国ごとの名前に設定します。日本ならばja、アメリカならばenといった感じです。フォルダと一致するとわかりやすいかもしれません。
en及びjaフォルダの中身は、バイナリ的には異なっていても良いですが、ファイル名は同一に設定します。
最後にjaもしくはenのどちらかのテクスチャを参照しているPrefabを作成し、resとは異なるAssetBundleに格納します。
最後にAssetBundleをビルドして準備は完了です。
後は実際に作成したprefabをロードしてみます。
AssetBundleの読込
AssetBundleを読み込みます。
下のコードを適当なオブジェクトに設定し、variant名である「en」もしくは「ja」を設定します。
これで、variant名に従い各国ごとの旗が表示されます。variantを設定する以外で特にスクリプト側でやることはありません。
ScriptableObjectでテキストデータの差し替え
次にテキスト等のデータを差し替えます。差し替える方法は、ScriptableObjectを使用します。
まずScriptableObjectのDataを作成し、Variantとして各国のフォルダに配置、あとはLocalizeTextをテキストに設定して参照先にVariantで指定したDataを設定します。
gist.github.comこれでPrefabをロードした際に各言語に対応したScriptableObjectを取得し、内容によってテキスト表記を切り替える事が出来ます。
フォントも(名前を同一に設定すれば)変更出来るので、読みやすいフォントに差し替えるのが良いと思います。
Prefabより大量生産が楽そうですが、UIの微調整等はやりにくいです。その辺りで使い分けると良さそうです。
Prefabの差し替えでレイアウト破綻を回避
英語のレイアウトで中身を差し替えた場合、文字幅が合わなかったり色々な原因によりレイアウトが崩れる事があります。そんな場合は、Prefab単位で差し替えてしまいます。
シーンに配置したプレハブはシーンに結合されてしまうみたいですが、プレハブに対する参照はアセットとして参照するように変更されたらしく、プレハブの差し替えも可能になったっぽいです(多分)
ということで、実行時にPrefabを構築することで、ちょっとしたレイアウトの変更も対応出来るようになったっぽいです。
縦文字と横文字、また国旗の位置が異なっていることが確認出来ます。
ScriptableObjectより微調整が効きますが、種類が大量にある場合は面倒になります。その辺りで使い分けると良さそうです。
Resourcesのようにスクリプトから呼び出すアセット群
スクリプトからアクセスするならば、参照先も自由に切り替えられるのでVariantを使用せずとも切り替えられるハズです。
つまり、展開するAssetBundleを切り替えてやればよいかなと。
AssetBundleManagerのSimulatorモード使用した時の問題
AssetBundleManagerを使用した場合、というかAssetBundleManagerのSimulatorモード(AssetBundleを構築せずAssetBundleから読み込むように振る舞うモード)を使用した場合、一点問題があります。それは動作しないという点です。
Simulatorモードを使用しなければ全く問題ないのですが、もし使用しているならばVariantを使用してるアセットの掃差替のような機能が必要になるかもしれません。
なおLocalServerモード(ローカルにサーバーを立ててソコからAssetBundleをダウンロードする)の場合は、問題なく動作します。