赞
踩
AssetBundle是Unity提供的一种资源存储压缩包,包含了一些Unity的资源,如图片,模型,纹理,音视频等等,也可以包含用户自定义的二进制文件。提供了一种程序运行时动态加载资源包的方法,如游戏中不同版本的资源更新即通过更新资源AB包即可。
Unity官方文档描述AssetBundle为一个容器,就像文件夹一样,包含其他文件。这些其他文件有两种类型,一种是序列化文件,包含资产分解成单独的对象并写到该单个文件中。(o((⊙﹏⊙))o,在说什么);另一种是资源文件,是为某些资产(纹理和音频)单独存储的二进制数据块,以允许Unity从另一个线程上的磁盘有效加载它们。
总而言之,AssetBundle就是一种资源包,让你能在运行时动态的加载卸载它,也可以灵活更新,即可以无需放在游戏本地,大大降低了包体大小。
NOTE
Unity提供了两种加载资源的方法(2018.2之后又新增一种)
其实无论是用Resources或者Addressable加载方式,底层都是基于AssetBundle实现的,只是Unity引擎会自动做这步操作
官方文档:
https://docs.unity3d.com/Manual/AssetBundlesIntro.htmldocs.unity3d.com将要打包成AssetBundle的资源设置AB包名字和变体名字
AssetBundleName不能包含"."这个特殊字符,会与variant产生冲突
使用/分隔符可以按层级建AB包,如AssetBundleName为A/B/C的AB包会被打包成A文件夹下的B文件夹下的名字为C的AB包
参考链接: https:// dev.twsiyuan.com/2017/0 5/unity-assetbundles-variants.html
将哪些资源打包到一个AB包下是让人头疼的事情,就像你要把你的衣服放进衣柜里,总而言之就是整理的过程,而这种事情越早确定越好,到后期再更改就显得很麻烦。
Unity官方推荐的分类方式有以下几种:混合搭配才是王道
以下是官方给出的一些分类建议:
无非两种方案,一种手动,一种写脚本按一定规则变成自动
一键自动设置AssetBundleName和Variant
可设置规则,如按文件夹进行AB包的命名,同个文件夹下的资源打包到同一个AB包
设置AB包AssetBundleName和Variant的API如下:
AssetImporter.GetAtPath(filePath).SetAssetBundleNameAndVariant(bundleName, bundleVariant);
前期准备做好了之后,这里就比较简单了,调用Unity的打包API就OK了,不过这里需要注意打AB包的一些参数设置,不同平台,不同的压缩方式等。
- //方式1. Unity会遍历所有设置过AssetBundleName及Variant的文件进行全局打包
- BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath,
- BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX);
-
-
- //方式2. 通过一个BuildMap打包指定的文件
- AssetBundleBuild[] buildMap = new AssetBundleBuild[2];
- buildMap[0].assetBundleName = "enemybundle";
- string[] enemyAssets = new string[2];
- enemyAssets[0] = "Assets/Textures/char_enemy_alienShip.jpg";
- enemyAssets[1] = "Assets/Textures/char_enemy_alienShip-damaged.jpg";
- buildMap[0].assetNames = enemyAssets;
-
- buildMap[1].assetBundleName = "herobundle";
- string[] heroAssets = new string[1];
- heroAssets[0] = "char_hero_beanMan";
- buildMap[1].assetNames = heroAssets;
-
- BuildPipeline.BuildAssetBundles("Assets/ABs", buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
通过UnityWebRequestAssetBundle加载的LZMA格式AB包将自动重新压缩为LZ4压缩,并缓存在本地文件系统上。而通过自己写的下载方案,则可以调用AssetBundle.RecompressAssetBundleAsync API重新压缩
NOTE
使用 ChunkBasedCompression具有与 BuildAssetBundleOptions.UncompressedAssetBundle差不多的加载时间,却具有减小磁盘大小的额外好处。
打包平台,即要打包哪个平台的AB包,如Android平台则使用BuildTarget.Android,不同平台使用的AB包不同,无法跨平台使用。
一般本地的AB包放在Unity特殊目录StreamingAssets下,通过Application.streamingassetpath读取
和Resources特殊目录一样,Unity会将该目录下的所有文件都打包,故需要特别注意,在打包不同平台的应用程序时,避免将其他平台的AB包一起打包,否则将大大增加包体大小。如Android的apk包就不应该确保StreamingAssets目录下只有Android平台的资源,其他平台的资源都是没用的,只会增加包体大小。
无论用何种方式打包AB包,最终生成的文件结构都是相同的。在同一输出文件夹下,生成的文件数目为该文件夹下 AB包数目*2+2,即假设有2个AB包打包输出到同一文件夹下,则在该文件夹下会生成6个文件。
每个AB包都会生成一份AB包本体文件(如上图的cube.a,若没有设置AB包Variant,则默认AB包后缀为.assetbundle),一份AB包的清单文件(上图的cube.a.manifest);
另外文件夹下会生成文件夹同名的两个文件,上图的StreamingAssets及StreamingAssets.manifest。StreamingAssets文件没有意义,StreamingAssets.manifest记录了一份该文件夹下AB包清单。
AB包的manifest则记录了AB包的一些依赖关系以及包含的资源清单,该清单仅用于查看,没有其他意义。
故构建AB包后真正有用的文件就是生成的AB包本体。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。