Unity中AB包详解(超详细,特性,打包,加载,管理器)

您所在的位置:网站首页 手机中bundle压缩包是什么文件 Unity中AB包详解(超详细,特性,打包,加载,管理器)

Unity中AB包详解(超详细,特性,打包,加载,管理器)

2024-07-12 02:48| 来源: 网络整理| 查看: 265

Unity中的AssetBundle详解 AssetBundle的概念

AssetBundle又称AB包,是Unity提供的一种用于存储资源的资源压缩包。

Unity中的AssetBundle系统是对资源管理的一种扩展,通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,可以动态地加载和卸载AB包,继而有选择地加载内容。

AssetBundle的优势

AB包存储位置自定义,继而可放入可读可写的路径下便于实现热更新

AB包自定义压缩方式,可以选择不压缩或选择LZMA和LZ4等压缩方式,减小包的大小,更快的进行网络传输。

资源可分布在不同的AB包中,最大程度减少运行时的内存压力, 可做到即用即加载,有选择的加载需要的内容。

AB包支持后期进行动态更新,显著减小初始安装包的大小,非核心资源以AB包形式上传服务器,后期运行时动态加载,提高用户体验。

AssetBundle和Resources的比较 AssetBundleResources资源可分布在多个包中所有资源打包成一个大包存储位置自定义灵活必须存放在Resources目录下压缩方式灵活(LZMA,LZ4)资源全部会压缩成二进制支持后期进行动态更新打包后资源只读无法动态更改 AssetBundle的特性

AB包可以存储绝大部分Unity资源但无法直接存储C#脚本,所以代码的热更新需要使用Lua或者存储编译后的DLL文件。

AB包不能重复进行加载,当AB包已经加载进内存后必须卸载后才能重新加载。

多个资源分布在不同的AB包可能会出现一个预制体的贴图等部分资源不在同一个包下,直接加载会出现部分资源丢失的情况,即AB包之间是存在依赖关系的,在加载当前AB包时需要一并加载其所依赖的包。

打包完成后,会自动生成一个主包(主包名称随平台不同而不同),主包的manifest下会存储有版本号、校验码(CRC)、所有其它包的相关信息(名称、依赖关系) 在这里插入图片描述

AssetBundle全打包流程

本次主要介绍Unity官方提供的AB包管理插件AssetBundle Browser 进行打包

1、AssetBundleBrowser插件的获取

Unity 2019版本可以直接在Windows —> PackageManager里面找到此插件并直接安装

2020版本之后或其它版本可能在1方法中找不到此插件,可以通过去github搜索下载压缩包,下载地址https://github.com/Unity-Technologies/AssetBundles-Browser

在这里插入图片描述

将下载后的安装包解压到Unity工程的Packages文件夹下 (一定要解压)

在这里插入图片描述

2、AssetBundleBrowser面板的使用

正确获取到并安装完插件后,通过 Windows ----> AssetBundle Browser下打开AB包管理面板 一共有三个面板

Configure面板 :能查看当前AB包及其内部资源的基本情况(大小,资源,依赖情况等)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7iIL4QAL-1644109483100)(知识点总结2-AB包.assets/image-20220127124332879-16432586143164.png)]

Build面板:负责AssetBundle打包的相关设置 按Build即可进行打包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mp5AKQsC-1644109483100)(知识点总结2-AB包.assets/image-20220127151926768-16432679678095.png)]

三种压缩方式

NoCompression:不压缩,解压快,包较大,不建议使用。LZMA: 压缩最小,解压慢,用一个资源要解压包下所有资源。LZ4: 压缩稍大,解压快,用什么解压什么,内存占用低,更建议使用。

一般需要进行更改的设置即为图中勾选的相关选项设置。

Inspect面板:主要用来查看已经打包后的AB包文件的一些详细情况(大小,资源路径等)

在这里插入图片描述

3、设置资源所属的AssetBundle包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z08RRDsL-1644109483101)(知识点总结2-AB包.assets/image-20220127153106012-16432686679037.png)]

在需要打包的资源的Inspector面板下方即可选择其应放在哪个AB包下,也可通过New新建AB包将资源放入,放入后再次Build打包即可将此资源打入相应的AB包中。

AssetBundle管理器

​ 利用AssetBundleBrowser可以轻松实现AB包的打包工作,更重要的是如何将AB包中的资源加载出来并使用它们,Unity已经提供了一组API能够实现AB包的加载和资源的加载。

AB包管理器的主要需求:加载指定AB包下的指定资源,基本步骤如下:

加载资源所在AB包及其的所有依赖包(根据主包的manifest信息找依赖包名称)从AB包中加载指定的资源(根据名称,类型)不再使用时卸载已经加载了的AB包

主要相关API

//AB包加载所需相关API //1. 根据路径进行加载AB包 注意AB包不能重复加载 AssetBundle ab = AssetBundle.LoadFromFile(path); //2. 加载ab包下指定名称和类型的资源 T obj = ab.LoadAsset(ResourceName); //泛型加载 Object obj = ab.LoadAsset(ResourceName); //非泛型加载 后续使用时需强转类型 Object obj = ab.LoadAsset(ResourceName,Type); //参数指明资源类型 防止重名 T obj = ab.LoadAssetAsync(resName); //异步泛型加载 Object obj = ab.LoadAssetAsync(resName); //异步非泛型加载 Object obj = ab.LoadAssetAsync(resName,Type); //参数指明资源类型 防止重名 //3. 卸载ab包 bool参数代表是否一并删除已经从此AB包中加载进场景的资源(一般为false) ab.UnLoad(false); //卸载单个ab包 AssetBundle.UnloadAllAssetBundles(false); //卸载所有AB包

下面是AB包管理器的详细代码和注释,里面涉及到的单例模式内容后面会简单进行介绍。

ABManager.cs

using System; using System.Net.Mime; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Common { /// /// AB包管理器 全局唯一 使用单例模式 /// public class ABManager : MonoSingleton { //AB包缓存---解决AB包无法重复加载的问题 也有利于提高效率。 private Dictionary abCache; private AssetBundle mainAB = null; //主包 private AssetBundleManifest mainManifest = null; //主包中配置文件---用以获取依赖包 //各个平台下的基础路径 --- 利用宏判断当前平台下的streamingAssets路径 private string basePath { get { //使用StreamingAssets路径注意AB包打包时 勾选copy to streamingAssets #if UNITY_EDITOR || UNITY_STANDALONE return Application.dataPath + "/StreamingAssets/"; #elif UNITY_IPHONE return Application.dataPath + "/Raw/"; #elif UNITY_ANDROID return Application.dataPath + "!/assets/"; #endif } } //各个平台下的主包名称 --- 用以加载主包获取依赖信息 private string mainABName { get { #if UNITY_EDITOR || UNITY_STANDALONE return "StandaloneWindows"; #elif UNITY_IPHONE return "IOS"; #elif UNITY_ANDROID return "Android"; #endif } } //继承了单例模式提供的初始化函数 protected override void Init() { base.Init(); //初始化字典 abCache = new Dictionary(); } //加载AB包 private AssetBundle LoadABPackage(string abName) { AssetBundle ab; //加载ab包,需一并加载其依赖包。 if (mainAB == null) { //根据各个平台下的基础路径和主包名加载主包 mainAB = AssetBundle.LoadFromFile(basePath + mainABName); //获取主包下的AssetBundleManifest资源文件(存有依赖信息) mainManifest = mainAB.LoadAsset("AssetBundleManifest"); } //根据manifest获取所有依赖包的名称 固定API string[] dependencies = mainManifest.GetAllDependencies(abName); //循环加载所有依赖包 for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3