【Unity】AssetBundleのVariantsでロードするアセットを差し替える
今回はAssetBundleのVariantsで、リソースを差し替えてみます。
シーン/プレハブが参照するアセットを差し替えるVariants
AssetBundleのVariantsは、「AssetBundleから取得するアセットを差し替える」機能です。
通常Unityの依存関係は各アセット毎に割り振られるGUIDを使用して管理しますが、Variantsを指定した場合は、同AssetBundle名で同アセット名なアセットに参照先が差し替えられます。
例えば、ゲームのUIを構成しているスプライトやキャラクターのイメージを、ゲームをプレイする国や言語毎に差し替えたいケースがあります。
通常はスクリプトにて実行時にイメージを差し替える…といったフローが必要になるのですが、Variantsを利用する事で、リソースを読み込むAssetBundleを切り替えるだけでリソースの差し替えが完了します。
用途的には「ローカライズによるリソース差し替え」や「SD/HDの切替」、「ScriptableObject切替による難易度の調整(スクリプトでやった方が幸せになるかも)」といった物に使えそうです。
ちなみに、今回はプレハブを使用する例ですが、SceneをAssetBundleに格納した場合でも使用することができます。SD/HDの切替とかをScene単位で行うのは、結構理に適ってる感じがします。
Variantsを使用してみる
Variantを使用するには、以下の設定を行います。
- AssetBundleでVariantを設定する
- Variant内で同名のオブジェクトを持つ
- AssetBundle読み込み時に、AssetBundle名にVariantを設定する
実際にVariantsを使用してみる
実際にVariantsを使用してみます。
今回はAssetBundleからプレハブを1つ取得するサンプルを作成します。但し、取り出すプレハブにはスプライトを設定して起き、Variantsの値によって読み込むスプライトを切り替えます。
プレハブの作成
まずはプレハブを作成します。名前は適当にPlayerPrefabとかしておきます。
プレハブはPlayer.pngのイメージに対して参照を持っているだけです。
作ったプレハブは「prefab」というAssetBundle名を設定しておきます。
まだ、このままプレハブをAssetBundleから読み込むと、今まで通りプレハブに設定したスプライト画像で表示されます。
Variantの設定
次に画像のVariantを作成します。この設定で「同名のスプライトはVariant設定で差し替える」ようになります。
まずプレハブから参照しているスプライトと同名のファイルを用意します。但し殆どのOSの都合上、同じフォルダに同名のファイルは配置出来ないので、異なるフォルダに配置します。
次にリソースにAssetBundle名とVariantを設定します。Variantを設定する場合は同名のAssetBundle名じゃないと動かないです。
なお、AssetBundle名とVariant名は問答無用で小文字に変換される点にご注意を。
今回はプレハブから参照している通常の服を着たバージョンに「type-a」、青い模様を付けたバージョンに「type-b」というVariant名を設定します。
なお、ファイル毎にAssetBundle名やVariant名を設定するのは正直面倒なので、AssetBundle名やVariant名をフォルダに設定し、ファイルをフォルダに配置する方をお勧めします。
あとはAssetBundleを出力すると、character.type-aとcharacter.type-bというAssetBundleが作成されます。
「prefab」のAssetBundleにはプレハブ、「character.type-a」と「character.type-b」には、それぞれキャラクター用のスプライトが格納されています。
またprefabはcharacterに対しての依存関係を持っています。
AssetBundleを読み込む
後はAssetBundleを読み込みます。
基本的には依存先のAssetBundleと一緒にプレハブのAssetBundleを取得するだけです。character.type-aを読んでいればtype-aに格納したスプライトが、type-bを読んでいればtype-bに格納したスプライトが読み込まれます。
注意点
割と便利なVariantsですが、少しややこしい制約として「Variantsにプレハブを設定することができません」。どうもプレハブはAssetBundleをビルドした地点で参照先のプレハブも含めて結合されているらしく、こういった分割は出来ないみたいです。
バグだったみたいです。
なので、こういった事も可能になりました。
AssetBundleManager
ちなみに、AssetBundleManagerを使用する場合は、AssetBundleManager.ActiveVariantsに使用したいVariantsを設定しておけばOKです。
これでVariantsが設定されているAssetBundleを読む場合は、自動的に選択したAssetBundleを読み込んでくれるっぽいです。
なお、シミュレーターモードではVariantsは動作しないみたいです。
関連
© UTJ/UCL