Unity中AB包详解(超详细,特性,打包,加载,管理器)
Unity中的AstBundle详解
AstBundle的概念
AstBundle⼜称AB包,是Unity提供的⼀种⽤于存储资源的资源压缩包。八年级下册英语书人教版
Unity中的AstBundle系统是对资源管理的⼀种扩展,通过将资源分布在不同的AB包中可以最⼤程度地减少运⾏时的内存压⼒,可以动态地加载和卸载AB包,继⽽有选择地加载内容。
AstBundle的优势
1. AB包存储位置⾃定义,继⽽可放⼊可读可写的路径下便于实现热更新
2. AB包⾃定义压缩⽅式,可以选择不压缩或选择LZMA和LZ4等压缩⽅式,减⼩包的⼤⼩,更快的进⾏⽹络传输。
3. 资源可分布在不同的AB包中,最⼤程度减少运⾏时的内存压⼒, 可做到即⽤即加载,有选择的加载需要的内容。
4. AB包⽀持后期进⾏动态更新,显著减⼩初始安装包的⼤⼩,⾮核⼼资源以AB包形式上传服务器,后期运⾏时动态加载,提⾼⽤户体
验。
AstBundle和Resources的⽐较
AstBundle Resources
资源可分布在多个包中所有资源打包成⼀个⼤包
存储位置⾃定义灵活必须存放在Resources⽬录下
压缩⽅式灵活(LZMA,LZ4)资源全部会压缩成⼆进制
⽀持后期进⾏动态更新打包后资源只读⽆法动态更改
AstBundle的特性
1. AB包可以存储绝⼤部分Unity资源但⽆法直接存储C#脚本,所以代码的热更新需要使⽤Lua或者存储编译后的DLL⽂件。
2. AB包不能重复进⾏加载,当AB包已经加载进内存后必须卸载后才能重新加载。
3. 多个资源分布在不同的AB包可能会出现⼀个预制体的贴图等部分资源不在同⼀个包下,直接加载会出现部分资源丢失的情况,即AB
包之间是存在依赖关系的,在加载当前AB包时需要⼀并加载其所依赖的包。
4. 打包完成后,会⾃动⽣成⼀个主包(主包名称随平台不同⽽不同),主包的manifest下会存储有版本号、校验码(CRC)、所有其它包的
相关信息(名称、依赖关系)
AstBundle全打包流程
本次主要介绍Unity官⽅提供的AB包管理插件AstBundle Browr 进⾏打包
1、AstBundleBrowr插件的获取
1. Unity 2019版本可以直接在Windows —> PackageManager⾥⾯找到此插件并直接安装
2. 2020版本之后或其它版本可能在1⽅法中找不到此插件,可以通过去github搜索下载压缩包,下载地址/Unity-
Technologies/AstBundles-Browr
将下载后的安装包解压到Unity⼯程的Packages⽂件夹下 (⼀定要解压)
2、AstBundleBrowr⾯板的使⽤
正确获取到并安装完插件后,通过 Windows ----> AstBundle Browr下打开AB包管理⾯板 ⼀共有三个⾯板Configure⾯板 :能查看当前AB包及其内部资源的基本情况(⼤⼩,资源,依赖情况等)
Build⾯板:负责AstBundle打包的相关设置 按Build即可进⾏打包
三种压缩⽅式
1. NoCompression:不压缩,解压快,包较⼤,不建议使⽤。
2. LZMA: 压缩最⼩,解压慢,⽤⼀个资源要解压包下所有资源。
3. LZ4: 压缩稍⼤,解压快,⽤什么解压什么,内存占⽤低,更建议使⽤。
⼀般需要进⾏更改的设置即为图中勾选的相关选项设置。
Inspect⾯板:主要⽤来查看已经打包后的AB包⽂件的⼀些详细情况(⼤⼩,资源路径等)
3、设置资源所属的AstBundle包
在需要打包的资源的Inspector⾯板下⽅即可选择其应放在哪个AB包下,也可通过New新建AB包将资源放⼊,放⼊后再次Build打包即可将此资源打⼊相应的AB包中。
AstBundle管理器
利⽤AstBundleBrowr可以轻松实现AB包的打包⼯作,更重要的是如何将AB包中的资源加载出来并使⽤它们,Unity已经提供了⼀组API能够实现AB包的加载和资源的加载。
AB包管理器的主要需求:加载指定AB包下的指定资源,基本步骤如下:accuracy
1. 加载资源所在AB包及其的所有依赖包(根据主包的manifest信息找依赖包名称)
2. 从AB包中加载指定的资源(根据名称,类型)
3. 不再使⽤时卸载已经加载了的AB包
主要相关API
下⾯是AB包管理器的详细代码和注释,⾥⾯涉及到的单例模式内容后⾯会简单进⾏介绍。
ABManager.cs //AB 包加载所需相关API //1. 根据路径进⾏加载AB 包 注意AB 包不能重复加载AstBundle ab = AstBundle .LoadFromFile (path );//2. 加载ab 包下指定名称和类型的资源T obj = ab .LoadAst <T >(ResourceName ); //泛型加载Object obj = ab .LoadAst (ResourceName ); //⾮泛型加载 后续使⽤时需强转类型Object obj = ab .LoadAst (ResourceName ,Type ); //参数指明资源类型 防⽌重名T obj = ab .LoadAstAsync <T >(resName ); //异步泛型加载Object obj = ab .LoadAstAsync (resName ); //异步⾮泛型加载Object obj = ab .LoadAstAsync (resName ,Type ); //参数指明资源类型 防⽌重名//3. 卸载ab 包 bool 参数代表是否⼀并删除已经从此AB 包中加载进场景的资源(⼀般为fal)ab .UnLoad (fal ); //卸载单个ab 包AstBundle .UnloadAllAstBundles (fal ); //卸载所有AB 包蹼泳
1
2
3
4
5
6
7
bargain
8
9
10
11
12
13
using ;using ;using ;using ;using ;namespace { /// <summary> /// AB 包管理器 全局唯⼀ 使⽤单例模式 /// </summary> public class ABManager : MonoSingleton <ABManager > { //AB 包缓存---解决AB 包⽆法重复加载的问题 也有利于提⾼效率。 private Dictionary <string , AstBundle > abCache ; private AstBundle mainAB = null ; //主包 private AstBundleManifest mainManifest = null ; //主包中配置⽂件---⽤以获取依赖包 //各个平台下的基础路径 --- 利⽤宏判断当前平台下的streamingAsts 路径 private string baPath { get { //使⽤StreamingAsts 路径注意AB 包打包时 勾选copy to streamingAsts #if UNITY_EDITOR || UNITY_STANDALONE return Application .dataPath + "/StreamingAsts/";#elif UNITY_IPHONE return Application .dataPath + "/Raw/";#elif UNITY_ANDROID return Application .dataPath + "!/asts/";#endif } } //各个平台下的主包名称 --- ⽤以加载主包获取依赖信息1
enthusiasm怎么读2
3
4
5
6
7
8
9
英国宣布解封计划10
11
12
13
14
15
16
17
18
19
20
21
22
23
24古建筑保护>英语四级准考证号忘了怎么查成绩
25
26
27
28
29hbu
30青少年在线英语
31
32
33
34