• 引言:主要介绍一下AB包的基本原理和打包过程

初步了解AB包

AB包是什么??

  • AB是特定平台的资产压缩包,类似于压缩文件
  • 资产包括:

    ​ 模型、贴图、预制体、音效等等。

  • 注意:C#代码不能打成AB包。所以代码要用Lua热更。

AB包有什么作用??

相对Resource下的资源AB包更好管理资源

image-20250815150402053

减少包的体积大小

  • 压缩资源

  • 减少初始包的大小

    打包时候AB可以放在远端,初始包只留一些默认资源。进入游戏之后再慢慢下载。

热更新

  • 资源热更新

  • 脚本热更新

    image-20250815150752717

AB包资源打包

如何让资源关联AB包

  • 我们把一个场景物体拖成预制体,再inspector窗口就能看到如下内容(其他资源也可以去关联)

    image-20250815152013516

  • 第一个标签为:打入哪个包中。

  • 第二个标签为:扩展名(不动就行 )

    image-20250815152150284

    • 这样就把Cube这个物体关联到了model这个包里面
    image-20250815152214839
  • 疑问:C#脚本不能打包进去,但是物体上关联的很多组件不也算是脚本吗?为什么可以打包

  • 答:预制体上面的一些组件,看起来是脚本,实际上都是C#通过反射得到的文件信息

    image-20250815152808420

AB包打包

  • 指定平台打包

  • 打包后的路径

    image-20250815153048754

  • 压缩方式

    image-20250815153250761

    压缩方式默认有两种

    image-20250815153318850

    • LZMA压缩

      LZMA是整体压缩,我们用一个包里面内容,就会把整个AB包全压缩出来,压缩比很高,内存占用高

    • LZ4

      LZ4小包压缩,用哪个压哪个,内存占用低

  • Clear Folders:是否清空文件夹 重新打包

  • Copy To StreamingAssets : 是否拷贝到StreamingAssets文件夹

  • 打包后会出现一个主包和若干AB包资源文件和配置文件

    image-20250815155112402

  • manifest文件

    这是AB包文件信息,里面有资源信息、依赖关系、版本信息等等

  • 主包(和目录名一样的包)

    主要记录AB包的一依赖关系

  • 这个页面主要是查看打包后,包的大小

image-20250815155438232

使用AB包中资源文件

同步加载

  • 注:AB包不能重复加载,否则报错
1
2
3
4
5
6
7
8
//第一步 加载AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
//第二步 加载包中资源
//只使用名字加载会出现 同名不同类型资源分不清
//建议使用泛型加载或者Type 指定类型
//AB包不能重复加载,否则报错
GameObject gameObject = ab.LoadAsset<GameObject>("Cube");
Instantiate(gameObject);

异步加载

1
2
3
4
5
6
7
8
IEnumerator LoadABRes(string ABName, string resName)
{
AssetBundleCreateRequest ab = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABName);
yield return ab;
AssetBundleRequest abq = ab.assetBundle.LoadAssetAsync<GameObject>(resName);
yield return abq;
Instantiate(abq.asset as GameObject);
}

AB包卸载

1
2
3
4
   //ture是不仅会卸载Ab包,AB包加载资源也会被卸载
AssetBundle.UnloadAllAssetBundles(false);
//单独卸载一个包
ab.Unload(fasle)

AB包依赖

  • 一个资源身上用了别的AB包中的资源,这个时候如果只加载自己的AB包,通过它创建对象,就会出现资源丢失
  • 比如:材质和预制体分来打包,只加载预制体,就会丢失材质
  • 这种时候 需要把依赖包 一起加载了 才正常

疑问:如果不知道依赖关系呢??

  • 我们可以利用主包获取依赖关系
1
2
3
4
5
6
//加载主包
AssetBundle abMain = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "PC");
//加载主包中的固定文件
AssetBundleManifest abManifest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//得到依赖包名字的数组
string[] strs = abManifest.GetAllDependencies(Application.streamingAssetsPath + "/" + "model");