テラシュールブログ

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

【Unity】AssetBundleからアセットを取得する4つの方法

AssetBundleからアセットを取得する方法について、少し整理します。

AssetBundleからアセットを取得する

普通にアセット(依存関係なし)を取得する場合、assetbundle.LoadAssetsを使用します。アセットの型は、例えばTextureやAnimationController、AnimationClip等の事です。

f:id:tsubaki_t1:20160719233545j:plain

マニュアルを見ると、下のように記述されています。

バージョン 5.0 以前では、ユーザーは Load を使って個々のコンポーネントを直接フェッチすることができました。これはもう使えません。今後は、最初に LoadAsset を使ってゲームオブジェクトを読み込み、その後オブジェクトのコンポーネントをルックアップしてください。

これは下のように、LoadAssetsでコンポーネントを指定出来なくなった事を意味します。例えばPrefabのEthanにAnimatorが設定されていた場合でも、LoadAssets<Animator>("filename")のような記述は出来ません。
GameObjectとして取得し、AnimatorをGetComponentする必要があります。

f:id:tsubaki_t1:20160719234015j:plain

ちなみにサブフォルダに配置したアセットであっても、アセット名で取得出来ます。例えば下のように本来ならばchara/Player/Ethanのような場所にあった場合でも、LoadAssets<GameObject>("Ethan");で取得します。

f:id:tsubaki_t1:20160719235433j:plain

ファイルパスを指定してAssetBundleからアセットを取得する

AssetBundleのアセットは、同一のAssetBundleに異なるファイルパスで同盟のアセットを格納する事が出来ます。例えば下のような感じです。EnemyとしてのEthanとPlayerとしてのEthanが設定されています。

f:id:tsubaki_t1:20160719234637j:plain

このような場合は、パスを指定してアセットを取得します。マニュアルには書いていませんでしたが、LoadAssetsはパス指定して取得する事も出来たりします。

f:id:tsubaki_t1:20160719235316j:plain

アセット名が重複しない場合は、素直にアセット名を指定して取得した方が楽じゃないかなと思います。

アセットの中に含まれているアセットを取得する

アセットの中には、アセットが内々に保持しているアセットもあります。
f:id:tsubaki_t1:20160720000033j:plain

そういったアセットでは、AssetBundle.LoadAssetWithSubAssetsを使用します。詳しくはこちら。

tsubakit1.hateblo.jp

アセットが依存しているアセットを取得する

依存先のアセットが同一のAssetBundleに含まれているなら、アセットを取得する際に一緒にロードされます。
依存先が異なるAssetBundleにある場合、LoadAssets前にAssetBundleをLoadしておけば一緒にロードされます。

tsubakit1.hateblo.jp

mainAsset

使えなくなるみたいです。
まぁUnity5では指定する方法が無くなるので…

関連

tsubakit1.hateblo.jp