Unity AssetsBundle从入门到精通

什么是AssetBundle

1,它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)
serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个),通常主观上不可见的,在unity使用的如Prefabs,Material....

resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载

2,它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。

AssetBundle的定义和作用

1,AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;

2,AssetBundle自身保存着互相的依赖关系;

3,压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;

4,把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小;

AssetBundle使用流程(简称AB)Unity AssetsBundle从入门到精通_第1张图片

Unity AssetsBundle从入门到精通_第2张图片

1,指定资源的AssetBundle属性

前者(xxxa/xxx)这里xxxa会生成文件夹,名字为xxx,后者为后缀名(无具体限制,但最后取有意义的后缀名)

2,构建AssetBundle包

2.1先创建脚本代码。

Unity AssetsBundle从入门到精通_第3张图片

2.2点击生成AssetsBundle

Unity AssetsBundle从入门到精通_第4张图片

在项目文件夹中会生成如下文件。

Unity AssetsBundle从入门到精通_第5张图片

3,上传AB包(上传到本地)


4,加载AB包和包里面的资源(官方api中的4种)

4.1,AssetBundle.LoadFromMemoryAsync(从内存加载)

//首先通过File,读取本地资源并转化为2进制数组。
        byte[] assetByte = File.ReadAllBytes("AssetsBundle/capsule.unity");
        //2.1同步加载 从内存中加载2进制数组,加载AB.
        AssetBundle ab = AssetBundle.LoadFromMemory(assetByte);
        //2.2异步加载。返回一个Request,再通过request得到Assetbundle.
        //AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(assetByte);
        //异步等待request 加载完成。(需要把方法标记为IEnumerable)
        //yield return request;
        //AssetBundle ab = request.assetBundle;
        //GameObject go = ab.LoadAsset("Capsule");
        //Instantiate(go);

4.2,AssetBundle.LoadFromFile(从本地加载)

//1.从本地加载AB AssetBundle.LoadFromFile("AssetsBundle/share.unity");
        //AssetBundle ab = AssetBundle.LoadFromFile("AssetsBundle/capsule.unity");
        //1.2异步加载本地AB,LoadFromFileAsync
        //AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync("AssetsBundle/capsule.unity");
        //yield return request;
     //GameObject go = ab.LoadAsset("Capsule");
     //Instantiate(go);

4.3,WWW.LoadFromCacheOrDownload(使用WWW类加载)

//判断caching是否准备好。
        //while(Caching.ready == false){
        //暂停一帧。
        //yield return null;
        //}
        //url 格式为:@“file://  @“file:/// 
WWW从本地加载
        //WWW www = WWW.LoadFromCacheOrDownload(@"file://D:\Users\Administrator\Documents\AssetBundle\AssetsBundle\capsule.unity",1);
        ////localhost 后跟AssetBundle资源的路径。
WWW服务器加载
//WWW www = WWW.LoadFromCacheOrDownload(@"http://localhost/AssetsBundle/capsule.unity", 1);      
//yield return www; //判读是否有错误。 //if(string.IsNullOrEmpty(www.error) == false){ // Debug.Log(www.error); //// //有错误就停止协程。 // yield break; //} //AssetBundle ab = www.assetBundle;
     //GameObject go = ab.LoadAsset("Capsule");
     //Instantiate(go);

4.4,UnityWebRequest

//(从本地路径)string uri = @"file://D:\Users\Administrator\Documents\AssetBundle\AssetsBundle\capsule.unity";
        //服务器下载路径。
        string uri = @"http://localhost/AssetsBundle/capsule.unity";
        UnityWebRequest webRequest = UnityWebRequest.GetAssetBundle(uri);

        yield return webRequest.Send();
        //4.1 DownloadHandlerAssetBundle获取assetbundle;
        //AssetBundle ab = DownloadHandlerAssetBundle.GetContent(webRequest);

        //4.2 webRequest.downloadHandler 获取DownloadHandlerAssetBundle 再得到assetbundle.


        AssetBundle ab = (webRequest.downloadHandler as DownloadHandlerAssetBundle).assetBundle;

        //加载assetbundle中的具体资源。
        GameObject go = ab.LoadAsset("Capsule");
        Instantiate(go);




你可能感兴趣的:(Unity AssetsBundle从入门到精通)