Unity AssetBundle加载资源包的四种方式

方式1 AssetBundle.LoadFromMemoryAsync 从内存异步加载

先通过File转化成byte数组,再从字节数组里读取转化成Assetbundle

IEnumerator aaa()
 {
      string ziyuan = "/Perfabs/xxx.assetbundle";//项目路径下的某个包
      AssetBundleCreateRequest request =  AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(ziyuan));//创建一个请求,异步的方式 
      yield return request;//等待load完成
      AssetBundle ab = request.assetBundle;//加载完后取到request里面的assetBundle对象
       //加载方式相同
      GameObject obj = ab.LoadAsset<GameObject>("xxx");
 }

方式2 AssetBundle.LoadFromFile 从文件加载


void bbb()
{
    string path = "C:/Users/zhengwenke/Documents/unity/new/and/xxx.assetbundle";//完整路径
     AssetBundle ab = AssetBundle.LoadFromFile(path);
     GameObject obj = ab.LoadAsset<GameObject>("xxx");
}

方式3 服务器加载或者本地加载

这种方式将要被UnityWebRequest代替,unity2017之后尽量使用第二种和第四种

 IEnumerator ccc()
{
                    //这是从本地路径加载,如果从服务器加载直接把http的地址换一下就可以了
                string path = @"file://D:\VMNEW\Trunk\Resources\Model32\77426_box.assetbundle"; //路径斜杠不能写错,不然会报未知错误
                while (Caching.ready == false)
                {
                   yield return null;
                }
                WWW www = WWW.LoadFromCacheOrDownload(path, 1);
                yield return www;
                //www有错误不会终止运行,所以要判断是否有错误信息
                if (string.IsNullOrEmpty(www.error)==false)
                {
                    Debug.Log(www.error);
                    yield break;
                }
                AssetBundle ab = www.assetBundle;
                //加载方式相同
                GameObject obj = ab.LoadAsset<GameObject>("xxx");
}

方式4 服务器加载或者本地加载

IEnumerator ddd()
            {
                //这是从本地路径加载,如果从服务器加载直接把http的地址换一下就可以了
                string uri = @"file:///C:/Users/zhengwenke/Documents/unity/new/and/xxx.assetbundle";
                UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
                yield return request.SendWebRequest();

                     //第一种方式 
                AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
                     //第二种方式 
                //AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;                      
                //加载方式相同
                GameObject obj = ab.LoadAsset<GameObject>("xxx");
            }

WWW的加载方式,在运行的时候会自动生成该包里的缓存在C盘里,如果下次再解压这个包,它会先去这个缓存里找,没有的话才会加载,所以不想让它有缓存的话,就用本地路径加载的方式,下图是目录位置


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!