了解AssetBundle
一:首先我先来了解一下AssetBundle用处:
1.AssetBundle是一个资源包(可以是压缩包),包括模型、贴图、预设体、声音、甚至是整个场景,可以在游戏运行的时候被加载。
2.AssetBundle自身保存着互相依赖的关系。
3.压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快进行网络传输。
4.把一些可以下载的资源放在AssetBundle里,可以减少安装包大小。
二:什么是AssetBundle我们可以总结为一下两点:
1.它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。而这些文件可以分为两类:serialized file和resource files.(序列化文件和源文件)。
serialized file(序列化文件):资源(比如模型,预设体等)被打碎放在一个对象中,最后统一被写进一个单独的文件 (只有一个)。
resource files:某些二进制文件(声音,图片)被单独保存,方便快捷加载。
2.它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。
AssetBundle使用流程
1、指定资源AssetBundle属性,(xxxa/xxx)这里xxxa会生成目录,名字为xxx.
2、构建AssetBundle包。
3、上传AB包到服务器。
4、加载AB包和包里的资源。
我们在场景中创建一个Cube,重命名为Wall
然后把wall拉成预设体,并指定AssetBundle属性
我们创建一个工具文件夹Editor(此文件里代码只有在unity编辑器里才会编译,不会被发布)
CreateAssetBundles中脚本打包脚本
在Assets 下Build AssetBundles执行,在跟目录生成了AssetBundles文件夹
文件内容:
AssetBundles 二进制文件,和包名一致,AssetBundles.mainfest记录了所有的AssetBundle包
wall.unity3d则是我们打的AB包,wall.unity3d.manifest则记录了AB包中的引用资源
加载本地的AB包与包里的资源
创建脚本LoadFromFileExample挂载在空物体LoadAB上
脚本LoadFromFileExample加载方法LoadAsset如下
运行效果如下
注:AssetBundle分组策略
一个AssetBundle就是一组,不是分文件夹
1、逻辑实体分组
a、一个UI界面或者所有UI界面一个包(这个界面里面的贴图和布局信息一个包)
b、一个角色或者所有的角色一包(这个角色里面的模型和动画一个包)
c、所有的场景所共享的部分一个包(包括贴图和模型)
2、按照类型分组
所有声音资源打成一个包,所有shader打成一个包,所有模型打成一个包,所有材质打 成一个包。
3、按照使用分组
把在某一时间内使用的所有资源打成一个包。可以按照关卡分,一个关卡所需要的资源包括角色、贴图、声音等打成一个包。也可以按照场景分,一个场景所需要的资源一个包。
AssetBundle分组策略-总结
1、把经常更新的资源放在一个单独的包里面,跟不经常更新的包分离。
2、把需要同时加载的资源放在一个包里面。
3、可以把其他包共享的资源放在一个单独的包里面。
4、把一些需要同时加载的小资源打成一包。
5、如果对于个同一个资源有两个版本,可以考虑通过后缀来区分 如:unity3dv1, unity3dv2
依赖打包
减少公共资源占有量:Unity自动处理,我们只需要把AssetBundle属性设置好,打包关系如下
参数解释:Build AssetBundle-
1、Build的路径(随意只要是在硬盘上都可以的)
2、BuildAssetBundleOptions
BuildAssetBundleOptions.None:使用LZMA压缩算法,压缩的包更小,但是加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。在下载的时候,可以使用LZMA算法,一旦被它下载了之后,他会使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快。
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源二不用解压全部。
注:使用LZ4压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小。
解:案例证明如:一个material的大小为134KB,LZMA压缩为62KB,LZ4压缩为84KB.
Manifest讲解:
我们先以share来讲解,打开share.manifest
CRC:文件验码,校验文件是否完整的。与之对应为MD5
Assets:指定了我们报里有哪些资源。
我们来讲解一下依赖:capsulewall.manifest来讲解
Dependencies:依赖。
注:
我们加载资源时,如prefable时,如果有依赖,我们要加载依赖,否则会出现丢失。加载的先后顺序没有关系。(官方API,说先加载依赖,但经过证实,与先后顺序无关。为了有一个好习惯,先加载依赖,比较符合逻辑些,好习惯)
简单的服务器搭建webserver
注:把资源放在NetBox2.exe同目录,运行NetBox.ext启动服务器
AssetBundles的使用
1、AssetBundle.LoadFromMemoryAsync(从内里里加载)
2、AssetBundle.LoadFromFile(从本地文件)
3、WWW.LoadFromCacheOrDownload(从服务器或本地,有一个缓存,2017以后将要 弃用)
4、UnityWebRequest(从服务器加载)
通过Manifest文件得到某个包的依赖
Manifest指的是(和文件夹同名的manifest),如
AssetBundle的卸载
卸载的两个方面:
1、减少内存使用
2、卸载不当有可能导致关联丢失
卸载的原则:
AssetBundle.Unload(true) 卸载所有资源,即使有资源在使用者。
1、在关卡切换、场景切换。
2、资源没有被调用的时候 卸载
AssetBundle.Unload(false)卸载所有没有被使用的资源
1、个别资源怎么卸载,通过Resources.UnloadUnusedAssets.
2、场景切换的时候
文件校验
AssetBundle浏览工具
Unity Asset Bundle Browser tool(开源的一个插件)
获得步骤:
Help=>Unity manual=>搜AssetBundle 在最后一个就可以看到了哦
GitHub的一个链接,然后我们进去下载
拉进工程,然后在Window=>AssetBundle Browser打开
网友评论