当把AssetBundle文件从服务器下载到本地后,需要将其加载到内存中并创建AssetBundle内存对象。
unity提供了四种方式来加载AssetBundle文件。
1.WWW.assetBundle属性
可以通过WWW.assetBundle属性创建一个assetBundle文件的内存对象,代码如下:
IEnumerator Start() { WWW www = WWW.LoadFromCacheOrDownload("www.songshizhao.com", 5); yield return www; if (www.error!=null) { Debug.Log(www.error); yield break; } AssetBundle myloadedAssetBundle = new AssetBundle(); }
2.AssetBundle.CreateFromFile
完整定义为,public static AssetBundle CreateFromFile(string path);
从磁盘文件读取对象,该方法只支持非压缩格式的AssetBundle,即打包时必须使用非压缩选项。
3.AssetBundle.LoadFromMemoryAsync
通过该接口可以创建一个异步的内存区域比如用户对AssetBundle进行加密时,可以先调用解密算法返回解密后的数据流,然后再通过AssetBundle.CreateFromMemory从数据流中创建AssetBundle对象。示例代码如下:
IEnumerator Start() { //开始下载 WWW www = WWW.LoadFromCacheOrDownload("www.songshizhao.com", 5); //等待下载完成 yield return www; if (www.error != null) { Debug.Log(www.error); yield break; } //从bytes数组中创建AssetBundle AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromMemoryAsync(www.bytes); yield return assetBundleCreateRequest; AssetBundle assetBundle = assetBundleCreateRequest.assetBundle; }
4.AssetBundle.LoadFromMemory
IEnumerator Start() { //开始下载 WWW www = WWW.LoadFromCacheOrDownload("www.songshizhao.com/nullexample.unity3d", 5); //等待下载完成 yield return www; if (www.error != null) { Debug.Log(www.error); yield break; } //从bytes数组中创建AssetBundle AssetBundle assetBundle= AssetBundle.LoadFromMemory(www.bytes); }
--------------------------------------------------------------------
需要注意的是,如AssetBundle之间存在依赖关系,需要先加载总的Manifest文件,通过manifest文件加载对应的依赖文件,然后再获得AssetBundle内存对象。