当AssetsBundle文件加载到内存完成后,就可以将它所包含的Assets加载到内存中,Unity提供了6种加载API供我们使用。在unity脚本编辑器中,打出AssetsBuLoadAssetndle.后出现智能提示,前面带着load的六个接口就是。分别是loadAsset,loadAssetAsync,loadallasset,loadAllassetAsync,loadAll WithSubasset ,loadAllWithSubassetAsync。Unity在5.0以后不再支持直接加载组件类型,先使用加载游戏对象然后查找组件对象。以下是使用一个loadAssetAsync接口加载Asset的示例代码,我的资源包打包了两个资源,一个音乐片段musicClip和一个文本(xml),分别获取asset资源方法如下。
public static AudioClip[] musics = new AudioClip[10];
public static TextAsset[] docs = new TextAsset[10];
int musicIndex=1;
IEnumerator Start()
{
WWW www = WWW.LoadFromCacheOrDownload("www.songshizhao.com/example/bundleName.bundleVarient", 0);
//等待下载完成
yield return www;
if (www.error != null)
{
//警告
Debug.Log(www.error);
yield break;
}
else
{
int musicindex = PlayerPrefs.GetInt("MusicIndex");
//从bytes数组中创建AssetBundle
AssetBundle assetBundle = www.assetBundle;
AssetBundleRequest request = assetBundle.LoadAssetAsync(sceneLoad.musicName[musicIndex], typeof(AudioClip));
musics[musicIndex] = request.asset as AudioClip;
AssetBundleRequest request2 = assetBundle.LoadAssetAsync(sceneLoad.xmlName[musicIndex], typeof(TextAsset));
docs[musicIndex] = request2.asset as TextAsset;
}
}
注意事项:经过试验,读取assetBundle是文件名字应该包含后缀名,而根据assetBundle获取asset的时候则不能带有后缀名,另外不同平台的assetBundle确实是不能通用的,比如生成的IOS包在安卓版软件上是确实不能成功加载的。