欢迎加入Unity业内qq交流群:956187480
qq扫描二维码加群
1.什么是Assetbundle?
它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files(序列化文件和源文件)。serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个);resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载
它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。
2.Assetbundle的作用?
AssetBundle是Unity引擎提供的一种资源打包方式,可以对除了C#脚本外的任何资源进行打包压缩处理。
如果想在Unity平台实现Lua热更新,Assetbundle技术是无法跳过的知识点,在unity平台我们进行热更新下来的资源都是需要事先进行Assetbundle打包处理的。
1.编辑器扩展编写
打包过程需要在编辑器模式下进行,所以我们就需要扩展编辑器,也就是不用运行就能执行的逻辑
public class EditorMenu {
[MenuItem("Tool/BuildAssetbundle")]
static void BuildABs()
{
//打包后的资源存放路径,这个路径根据项目情况不定
string abDataPath = Application.streamingAssetsPath ;
if (!Directory.Exists(abDataPath)) Directory.CreateDirectory(abDataPath);
//BuildAssetBundle函数后的三个参数分别为:存储路径;压缩方式;资源目标平台
var a = BuildPipeline.BuildAssetBundles(abDataPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
EditorUtility.ClearProgressBar();
Debug.Log("AssetBundle打包完毕");
}
}
注意:在我们打包的时候为了方便后面的资源释放更新我们要创建一个ab包的文件列表,这一步可以先忽略后面再处理。
因为我们从服务器端下载所有AssetBundle文件的时候需要这些文件的web路径,每个地址对应一个Assetbundle文件.我们不可能在代码中写几十上百个文件的web地址,所以说在打包的时候我们就要生成目录文件,后面不管是释放资源还是下载更新资源都要通过这个目录文件间接的获取地址和更新信息的。
static void BuildABs(string path)
{
//打包后的资源存放路径,这个路径根据项目情况不定
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
//BuildAssetBundle函数后的三个参数分别为:存储路径;压缩方式;资源目标平台
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
EditorUtility.ClearProgressBar();
Debug.Log("AssetBundle打包完毕");
///----------------------创建文件列表-----------------------
string newFilePath = path + "/files.txt";
if (File.Exists(newFilePath)) File.Delete(newFilePath);
paths.Clear(); files.Clear();
Recursive(path);
FileStream fs = new FileStream(newFilePath, FileMode.CreateNew);
StreamWriter sw = new StreamWriter(fs);
for (int i = 0; i < files.Count; i++)
{
string file = files[i];
string ext = Path.GetExtension(file);
if (file.EndsWith(".meta") || file.Contains(".DS_Store")) continue;
string md5 = GameTool.Md5File(file);
string value = file.Replace(path, string.Empty);
sw.WriteLine(value + "|" + md5);
}
sw.Close(); fs.Close();
AssetDatabase.Refresh();
}
2.打包类型及打包平台
BuildAssetBundleOptions
BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。 注意使用LZ4压缩,可以获得可以跟不压缩想媲美的加载速度,而且比不压缩文件要小
BuildTarget
Unity具有跨平台性,所以在打包的时候就要考虑到平台差异。打包的时候就要选择合适的平台类型
3.AssetLables资源标签
在Unity环境内除了脚本文件,选中任何文件在Inspector面板下都会出现一个AssetLables界面,我们通过这个给资源设置assetbunddle的文件名跟文件后缀。文件名就是打包ab包后的文件名是可以分目录嵌套的,后缀的话常用的有unity3的,assetbundle,ab等自定义,也可以不设置后缀,在文件名后面加后缀也行。文件名跟后缀都是小写。
AssetBundle分组策略总结:
a,把经常更新的资源放在一个单独的包里面,跟不经常更新的包分离
b,把需要同时加载的资源放在一个包里面
c,可以把其他包共享的资源放在一个单独的包里面
d,把一些需要同时加载的小资源打包成一个包
e,如果对于一个同一个资源有两个版本,可以考虑通过后缀来区分 v1 v2 v3
4.Manifest文件
打包结束后的资源包由两部分构成,一个是AssetBundle文件,另一个是Manifest文件
.meta文件是unity内部自动生成的文件可以忽略,manifest文件是专门用于存储打包后的AssetBundle文件的基本信息的。主要包含以下信息:
CRC校验码:类似于MD5,用于计算该资源的一个特殊信息标识
ClassTypes:当前资源关联使用到了Unity中的哪些类,这些类是以编号索引的形式存在的,每一个编号对应一个类文件
1.同一资源被不同的包依赖
如果不考虑依赖直接打包的话,那些共用的材质帖图就会被多次重复打包进去,包体就会变大。当遇到这种情况的时候建议把共用 的材质或者贴图打成一个共用包,这样再打包的时候这些共用包只会打一次,大大减小了包体的大小。
2.加载顺序导致的资源丢失
如果a包所依赖的贴图资源被打包在b资源里。如果先加载a包,后加载b包,a包就会出现贴图丢失的问题。遇到这个问题就要记住当包有依赖关系的时候,我们只能先加载被依赖的包,后加载主体包。
以上两种情况这里就不演示了,大家可以自己测一下。
欢迎hu加入Unity业内qq交流群:956187480
qq扫描二维码加群