一、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等方式来区分包

9039

被折叠的 条评论
为什么被折叠?



