読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】AssetBundleのVariantでローカライズ

Unity AssetBundle ローカライズ アセット・ファイル管理

AssetBundleのVariantを使用して、ローカライズ的な事を行うアプローチについてです。
今までは少し面倒なバグのせいで紹介するのを避けてきましたが、Unity 5.4bの何処かのバージョンでバグが治ったので、使えるようになりました。

Variantでローカライズ

VariantはAssetBundleの依存関係を解決する際、参照先を切り替える技術です。
Variantに関するお話はこちら。

tsubakit1.hateblo.jp

このVariantですが、デバイスの解像度やGPUによる違いを吸収し最適なテクスチャを適応する(ETC2対応ならETC2、ETC2非対応なら16bit color等)とかに使えますが、今回はコレをローカライズに使用します。

 

なお、VariantはあくまでもAssetBundleが依存関係を構築するケースで使用できます。ResourcesやBuild Settings等、ローカルからアクセスする場合には機能しません。

テクスチャやアセットの差し替え(下準備)

今回はAssetBundle Managerを使用します。

 

tsubakit1.hateblo.jp

最初はテクスチャやアセットの差し替えです。

まずは各国ごとのフォルダを作成し、全て同一のAssetBundleNameを指定します(今回の場合、resとしました)

次に、variant nameを各国ごとの名前に設定します。日本ならばja、アメリカならばenといった感じです。フォルダと一致するとわかりやすいかもしれません。

f:id:tsubaki_t1:20160617000828j:plain

en及びjaフォルダの中身は、バイナリ的には異なっていても良いですが、ファイル名は同一に設定します。

f:id:tsubaki_t1:20160617001302j:plain

最後にjaもしくはenのどちらかのテクスチャを参照しているPrefabを作成し、resとは異なるAssetBundleに格納します。

f:id:tsubaki_t1:20160617001737j:plain

最後にAssetBundleをビルドして準備は完了です。

f:id:tsubaki_t1:20160617002248j:plain

後は実際に作成したprefabをロードしてみます。

AssetBundleの読込

AssetBundleを読み込みます。
下のコードを適当なオブジェクトに設定し、variant名である「en」もしくは「ja」を設定します。

f:id:tsubaki_t1:20160617002433j:plain

gist.github.com

これで、variant名に従い各国ごとの旗が表示されます。variantを設定する以外で特にスクリプト側でやることはありません。

f:id:tsubaki_t1:20160617002814g:plain

ScriptableObjectでテキストデータの差し替え

次にテキスト等のデータを差し替えます。差し替える方法は、ScriptableObjectを使用します。

まずScriptableObjectのDataを作成し、Variantとして各国のフォルダに配置、あとはLocalizeTextをテキストに設定して参照先にVariantで指定したDataを設定します。

f:id:tsubaki_t1:20160617005230j:plain

f:id:tsubaki_t1:20160617005236j:plain

gist.github.comこれでPrefabをロードした際に各言語に対応したScriptableObjectを取得し、内容によってテキスト表記を切り替える事が出来ます。
フォントも(名前を同一に設定すれば)変更出来るので、読みやすいフォントに差し替えるのが良いと思います。

f:id:tsubaki_t1:20160617010435g:plain

Prefabより大量生産が楽そうですが、UIの微調整等はやりにくいです。その辺りで使い分けると良さそうです。

Prefabの差し替えでレイアウト破綻を回避

英語のレイアウトで中身を差し替えた場合、文字幅が合わなかったり色々な原因によりレイアウトが崩れる事があります。そんな場合は、Prefab単位で差し替えてしまいます。

f:id:tsubaki_t1:20160617011850j:plain

シーンに配置したプレハブはシーンに結合されてしまうみたいですが、プレハブに対する参照はアセットとして参照するように変更されたらしく、プレハブの差し替えも可能になったっぽいです(多分)

ということで、実行時にPrefabを構築することで、ちょっとしたレイアウトの変更も対応出来るようになったっぽいです。

f:id:tsubaki_t1:20160617012631j:plain

f:id:tsubaki_t1:20160617012529j:plain

gist.github.com

f:id:tsubaki_t1:20160617012954g:plain

縦文字と横文字、また国旗の位置が異なっていることが確認出来ます。

 

ScriptableObjectより微調整が効きますが、種類が大量にある場合は面倒になります。その辺りで使い分けると良さそうです。

Resourcesのようにスクリプトから呼び出すアセット群

スクリプトからアクセスするならば、参照先も自由に切り替えられるのでVariantを使用せずとも切り替えられるハズです。
つまり、展開するAssetBundleを切り替えてやればよいかなと。

AssetBundleManagerのSimulatorモード使用した時の問題

AssetBundleManagerを使用した場合、というかAssetBundleManagerのSimulatorモード(AssetBundleを構築せずAssetBundleから読み込むように振る舞うモード)を使用した場合、一点問題があります。それは動作しないという点です。

Simulatorモードを使用しなければ全く問題ないのですが、もし使用しているならばVariantを使用してるアセットの掃差替のような機能が必要になるかもしれません。

なおLocalServerモード(ローカルにサーバーを立ててソコからAssetBundleをダウンロードする)の場合は、問題なく動作します。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp