对unity中AssetBundle的个人总结

一、AssetBundle的解释

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

AssetBundle自身保存着互相的依赖关系,也就是说不同的包之间可以相互联系

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

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

二、AssetBundle的构建和使用

1.在Asset文件夹中,将需要构建AB包的资源设置AssetBundle标签,标签组成为xxx/xxxa.xxx,后缀可以任意,不区分大小写

2.在Editor文件夹中创建脚本CreatABfiles,引入命名空间using unityEditor;写一个静态方法,方法内容为:

 if (!Directory.Exists("AssetBundleFiles"))
        {
            Directory.CreateDirectory("AssetBundleFiles");
        }

BuildPipeline.BuildAssetBundles("给出要打包的文件路径(AssetBundleFiles)",BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);

然后可以通过[MenuItem("Assets/BuildAssetBundles")]扩展编辑器并增加了一个按钮,实现该方法的调用。

3.上传AB包到服务器

4.AB包的获取,关于AB包的获取有四个方法:

(1)AssetBundle.LoadFromMemonyAsync 从内存中加载

(2)AssetBundle.LoadFromFile从本地加载(当然还包括异步的方式)

(3)AssetBundle.LoadFromCacheOrDownLoad从本地或者网上下载

(4)UnityWebRequest 通过WebRequest类获取

对于第二种方式:

AssetBundle ab = AssetBundle.LoadFromFile("/");//可以是相对路径,就是从项目文件的跟目录进行查找

T obj = ab.LoadAsset<T>("objName");//这个name很重要,需要与资源的名字对应

Instantiate(obj);

异步的方式:

AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync("/");

yield return request ;

AssetBundle ab = request.AssetBundle;

对于第四种方式:

UnityWebRequest request = UnityWebRequest.GetAssetBundle(path);

path ="uri";

yield return request.send(); // 调用这个方法后才开始发出请求

AssetBundle ab = DownLoadHandleAssetBundle.GetContent(request);

三、构建过程中的BuildAssetBundleOptions选项

1..None :默认方法,采用的是LZMA高压缩算法,得到的压缩包更小的,但加载速度更慢。在第一次时需要全部解压,然后再使用LZ4算法压缩,(由于LZ4算法是分批分内容压缩)后续调用时则不需要全部解压仅解压需要调用的部分,后续调用会更快。

2..UnCompressAssetBundle不压缩加载快,但是所占空间大

3..ChunkBasedCompression基于块的压缩算法,使用LZ4算法,分配加载不要全部解压,加载更快可以跟未压缩相媲美。

四、什么是打包出来的manifest文件

在打包AB包时,在产生AB的文件根目录会生成一个与AB包文件名相同的AssetBundle文件和一个AssetBundle.manifest文件,后面这个文件中,包含了该文件夹中包含了多少个AssetBundle和每个AssetBundle的信息,同时还有每个包中所依赖的包。

与获取AssetBundle的方式一样,我们可以采用同样的方式获取manifest,只需要该读取AssetBundle的文件类型和名称(<Manifest>)然后可以通过manifest.getAllIndenpendence("资源名")获取某个资源的全部依赖,从而在加载资源时,加载出该资源的依赖,不会造成依赖资源找不到的问题。

同时 manifest文件还具有校验文件的目的,比如从unitywebquest下载时,CRC不符合则会重新下载。(CRC,MD5,SHA1)

五、AssetBundle的卸载

AssetBundle一直使用而不卸载则会占用过多的内存,有两种资源卸载的方式:AssetBundle.OnLoad(true)表示清除资源所占用的所有内存,因而如果场景中还有资源保持着对ab包的引用则会导致丢失。 AssetBundle.OnLoad(false)表示清除内存资源但如果场景中还有物体保持对ab包的引用时,会在内存中复制一份,而不会造成丢失,但是这样就会导致内存负担增加。推荐使用AssetBundle(true)

如果是采用的参数为false的方式,可以使用Resource.unloadunusedAsset()清除,或者加载场景时使用non-Additively方式,它会自动调用Resource.unloadunusedAsset()方法没有使用的内存资源。

六、AB包的打包策略

总的来说:1.按逻辑分组,一组UI一个包,一个角色一个包,一个场景一个包

                  2.类型分组:所有声音一个包,所有模型一个包,所有shader一个包

                  3.按照使用的时间,同一时间使用的所有资源包括模型、材质、声音等一个包。

1.Unity对项目中图片的保存是以图集的形式保存的,因而如果多个AB引用了不同的图片,将会导致多次将整个图集打包进了AB包,从而导致AB包中有重复的项目,更好的方式是将所有图片打包成一个AB包,然后作为其他所有引用图片的依赖包。

2.经常更新的包与不经常更新的包要分开,这样减小包的大小,加快更新速度

3.同时加载的资源放在一个包里

4.如果一个资源需要多个版本,可以通过后缀V1,V1等方式来区分包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值