AssetBundleからアセットを取得する方法について、少し整理します。
- AssetBundleからアセットを取得する
- ファイルパスを指定してAssetBundleからアセットを取得する
- アセットの中に含まれているアセットを取得する
- アセットが依存しているアセットを取得する
- mainAsset
- 関連
AssetBundleからアセットを取得する
普通にアセット(依存関係なし)を取得する場合、assetbundle.LoadAssetsを使用します。アセットの型は、例えばTextureやAnimationController、AnimationClip等の事です。
マニュアルを見ると、下のように記述されています。
バージョン 5.0 以前では、ユーザーは Load を使って個々のコンポーネントを直接フェッチすることができました。これはもう使えません。今後は、最初に LoadAsset を使ってゲームオブジェクトを読み込み、その後オブジェクトのコンポーネントをルックアップしてください。
これは下のように、LoadAssetsでコンポーネントを指定出来なくなった事を意味します。例えばPrefabのEthanにAnimatorが設定されていた場合でも、LoadAssets<Animator>("filename")のような記述は出来ません。
GameObjectとして取得し、AnimatorをGetComponentする必要があります。
ちなみにサブフォルダに配置したアセットであっても、アセット名で取得出来ます。例えば下のように本来ならばchara/Player/Ethanのような場所にあった場合でも、LoadAssets<GameObject>("Ethan");で取得します。
ファイルパスを指定してAssetBundleからアセットを取得する
AssetBundleのアセットは、同一のAssetBundleに異なるファイルパスで同盟のアセットを格納する事が出来ます。例えば下のような感じです。EnemyとしてのEthanとPlayerとしてのEthanが設定されています。
このような場合は、パスを指定してアセットを取得します。マニュアルには書いていませんでしたが、LoadAssetsはパス指定して取得する事も出来たりします。
アセット名が重複しない場合は、素直にアセット名を指定して取得した方が楽じゃないかなと思います。
アセットの中に含まれているアセットを取得する
アセットの中には、アセットが内々に保持しているアセットもあります。
そういったアセットでは、AssetBundle.LoadAssetWithSubAssetsを使用します。詳しくはこちら。
アセットが依存しているアセットを取得する
依存先のアセットが同一のAssetBundleに含まれているなら、アセットを取得する際に一緒にロードされます。
依存先が異なるAssetBundleにある場合、LoadAssets前にAssetBundleをLoadしておけば一緒にロードされます。
mainAsset
使えなくなるみたいです。
まぁUnity5では指定する方法が無くなるので…