当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包在安卓版软件上是确实不能成功加载的。