什么是AssetBundle

1、AssetBundle是一个资源压缩包,包含游戏中用到的各种各样的资源,例如:模型、图片、预制体、场景等;
2、AssetBundle是一种二进制文件,里面包含资源本身的数据、依赖资源的依赖关系;
3、主要使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;

AssetBundle的使用

1、在Unity中指定资源的AssetBundle属性
设置ab的名字

2、构建ab包
3、上传ab包
4、加载ab包和包中的资源

代码打包AssetBundle

打包是会将同时加载的资源放在同一个包里,各个包之间会保存相互依赖的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[MenuItem("Pence/BuildAssetsBundle")]
static void BuildAllAssetsBundle()
{
string outputPath = string.Empty;
BuildAssetBundleOptions options = BuildAssetBundleOptions.None;
BuildTarget target = BuildTarget.StandaloneWindows64;
switch (target)
{
case BuildTarget.Android:
outputPath = "./AssetsBundles/android";
break;
case BuildTarget.StandaloneWindows64:
outputPath = "./AssetsBundles/pc";
break;
}

Directory.CreateDirectory(outputPath);
BuildPipeline.BuildAssetBundles(outputPath, options, target);
}

AssetBundle的加载和卸载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void Start()
{
this.StartCoroutine(dowloadAssetsBtndle());
}

IEnumerator dowloadAssetsBtndle()
{
//从服务器下载ab包
UnityWebRequest webRequest = UnityWebRequest.Get(url);
yield return webRequest.SendWebRequest();

AssetBundle ab = AssetBundle.LoadFromMemory(webRequest.downloadHandler.data);
GameObject racePrefab = ab.LoadAsset<GameObject>("Assets/AssetsPackage/Prefabs/Player/Test.prefab");
GameObject.Instantiate(racePrefab);

ab.Unload(false);
}

注意点:

1、ab的卸载有可能导致丢失
2、在切换场景,或者确定不使用的时候卸载
AssetBundle.Unload(true) //卸载AB文件的内存镜像,且包含所有Load创建出来的对象
AssetBundle.Unload(false) //卸载AB文件的内存镜像,但是除了Load创建出来的对象
Reources.UnloadAsset(Object) //释放已加载的资源Object
Resources.UnloadUnusedAssets //卸载所有没有被场景引用的资源对象

AssetBundle分组策略总结

逻辑实体分组

1、UI界面根据功能分组;
2、单个模型一个包,共享的贴图单独分包;
3、一个场景一个包,共享部分单独分包;

类型分组

所有声音资源一个包,所有shader一个包,所有模型一个包,所有材质一个包

使用分组

把在某一时间内使用的所有资源打成一个包。可以按照关卡分,一个关卡所需要的所有资源包括角色、贴图、声音等打成一个包。也可以按照场景分,一个场景所需要的资源一个包

注意

1、经常更新的资源放在一个单独的包里面,跟不经常更新的包分离
2、把需要同时加载的资源放在一个包里面
3、可以把其他包共享的资源放在一个单独的包里面
4、把一些需要同时加载的小资源打包成一个包
5、如果对于一个同一个资源有两个版本,可以考虑通过后缀来区分,例如v1、v2、v3

Manifest文件


crc为校验码,通过其检查是否完整
Assets 表示包里包含多少资源
Dependencies 表示包有哪些依赖
注意:在加载这些包之前,也需要加载依赖的包,不然会丢失这部分内容,显示效果不正确

文件校验

CRC、MD5、SHA1都是通过对数据进行计算,来生成一个校验值,该校验值用来校验数据的完整性。
CRC一般用于通信数据的校验,MD5和SHA1用于安全领域,例如文件校验,密码加密等

AssetBundle浏览工具

GitHub 工具地址: AssetBundles-Browser