AssetBundle相关

1.AssetBundle的定义

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

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

什么是AssetBundle?

可以称之为压缩包,里面压缩了多个文件。两类:serialized file and resource files

serialized file:资源被打碎放在一个对象中,最后被写进一个单独的文件

resource files:二进制资源被单独保存,方便快速加载

AssetBundle加载到内存的时候,他是一个AssetBundle对象。

 

2.AssetBundle的使用流程

指定资源的AssetBundle属性

构建AssetBundle包

上传AB包

加载AB包和包里面的资源

 

3.AssetBundle的打包

(1)在unity中将要打包的AssetBundle包的AssetBundle属性添加上标签,可以通过加上/来划分子目录 eg:scenes/wall ,就会先创建一个scenes文件夹

(2)创建打包的代码

AB打包只会在editor状态的时候进行,使用BuildPipeline中的BuildAssetBundles方法,在目标文件中创建AB文件

[MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string dir = "AssetBundles";
        if (Directory.Exists(dir) == false)
        {
            Directory.CreateDirectory(dir);
        }
        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);

    }

(3)MenuItem特性让这个方法在Assets中生成

 

4.AssetBundle的加载和使用


使用AssetBundle类中的LoadFromFile方法,得到AssetBundle对象,加载ab对象中的资源得到GameObject,

实例化GameObject

AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/wall.unity3d");
        GameObject wallPrefab = ab.LoadAsset<GameObject>("Wall");
        Instantiate(wallPrefab);

 

5.AssetBundle分组策略

逻辑实体分组

一个UI界面或者所有UI界面一个包,一个角色或者所有角色一个包,所有场景共享的部分(贴图和模型)一个包

按照类型分组

所有声音资源、shader打成一个包

按照使用分组

按照关卡分组

 

6.依赖打包

当不同物体用到同一材质时,将不同物体和材质一起打包,将大大减小整个ab包的大小

 

7.BuildAssetBundles的参数

(1)dir路径(硬盘上的路径)

(2)BuildAssetBundlesOptions.None:默认LAMA算法压缩,压缩的包更小,但是加载时间更长。需要整体解压,一旦被整体解压,这个包会使用LZ4重新压缩

BuildAssetBundlesOptions.UncompressedAssetBundle:不压缩、包大,加载快

BuildAssetBundlesOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是可以加载指定资源而不用全部解压。

(3)BuildTarget打包的平台

 

8.Manifest文件

BuildAsset会生成Manifest文件

CRC效验码,校验文件是否完整

Assets说明文件包含哪些资源

Dependencies依赖,当前ab文件依赖了那些包。一个资源有依赖,要先加载依赖

 

9.AssetBundles的使用

异步的方式读取ab包,从内存中读取

IEnumerator Start () {
        string path = "AssetBundles/cube.unity3d";

        //第一种加载AB的方式 异步的方式
        AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
        yield return request;
        AssetBundle ab = request.assetBundle;
        
        GameObject test1 = ab.LoadAsset<GameObject>("Cube");
        Instantiate(test1);

    }

从文件中读取

!

10.WWW.LoadFromCacheOrDownload下载并加载AssetBundle

资源如果第一次获取,会先下载到本地,第二次再用就会从缓存直接加载。

file:// file:///才可以加载文件

IEnumerator Start () {
        while (Caching.ready == false)
        {
            yield return null; 
        }

        WWW www = WWW.LoadFromCacheOrDownload(@"file:///F:\unity project\AssetBundle\AssetBundles\cube.unity3d", 1);
        yield return www;
        if(string.IsNullOrEmpty(www.error)==false)
        {
            Debug.Log(www.error);
            yield break;
        }
        AssetBundle ab = www.assetBundle;

        GameObject test1 = ab.LoadAsset<GameObject>("Cube");
        Instantiate(test1);

    }

 

11.搭建简单的Server服务器

NetBox2 会自动在当前目录下操作,你只要在当前目录下创建一个html,写上文本,你的localhost就会变成你写的东西

 

12.使用这句话访问远程服务器上的资源

 WWW www = WWW.LoadFromCacheOrDownload(@"http://localhost/AssetBundles/cube.unity3d", 1);
        

13.UnityWebRequest下载AssetBundle

异步的接收文件,通过UnityWebRequest中的方法得到UnityWebRequest对象,调用Send方法才会从服务器端下载,

下载完成之后,使用DownloadHandlerAssetBundle.GetContent取得内容

IEnumerator Start () {
        //UnityWebRequest
        string uri = @"file:///F:\unity project\AssetBundle\AssetBundles\cube.unity3d";
        UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
        yield return request.Send();
        AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);

        GameObject test1 = ab.LoadAsset<GameObject>("Cube");
        Instantiate(test1);

    }

14.从AssetBundl加载资源

获取AssetBundleManifest,这个文件中包括了所有的资源的依赖。

通过GetAllDependencies得到我们使用的资源的依赖,再加载资源所依赖的包。

AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
        AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

        string[] strs = manifest.GetAllDependencies("cube.unity3d");
        foreach (string name in strs)
        {
            print(name);
            AssetBundle.LoadFromFile("AssetBundles/" + name);
        }

 

15.AssetBundle的卸载

卸载:减少内存使用,但是卸载不当会导致材质丢失
Unload方法参数为false,只有当资源不被引用的使用才卸载,如果Unload参数为true,不管资源是否引用,都会卸载

一般在场景切换的时候进行AB包的卸载。

 

16.关于文件校验

CRC、MD5、SHA1

对数据进行计算,来生成一个校验值,用来检测数据的完整性。MD5、SHA1的安全性比较高

 

17.AssetBundles浏览工具

AssetBundles-Browser通过文档找到github,再releases中可以下载导入到Unity的Editor文件中,再Window菜单栏中就可以查看了。

这个工具可以查看项目中使用到AB包的地方,也可以通过工具进行AB包的打包

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值