Unity 热更新学习笔记一:AssetBundle及其导出载入
为什么学习热更新?
在现代网游中,游戏体量太大,在每次更新的时候如果都要重新将游戏资源进行下载是极其消耗宽带资源与时间的,所以要学习热更新技术,使得每次游戏更新时只需下载热更新资源从而进行游戏的更新。
什么是AssetBundle?
简称为AB包,这是独立于游戏主包存在的资源存储文件,在使用内部资源时需要单独下载和加载。
如图:
AssetsBundle只是把一些资源文件,场景文件或二进制文件以某种方式存在一起。重要的是AssetBundle内部不能包含C#文件,AssetBundle使用Lua脚本语言实现游戏逻辑以及资源更新。
怎么创建AssetBundle?
选中资源之后在AssetLabel窗口下可以新建AB包
如下就是将图片规划到已创建的AB包中
到目前位置我们只是把资源规划到AB包中,但是并没有生成资源 ,想要生成资源就必须用脚本把AB包进行导出。
这里我们为了便捷,写一个工具类避免重复操作
导出AB包操作:创建了一个工具类脚本,首先创建AB包路径,然后使用 BulidPipeline.BuildAssetBundles将AB包导出
using System.IO; using UnityEditor; using UnityEngine; public class ExportAB { [MenuItem("AB包/导出")] public static void Export() { string path = Application.dataPath; path = path.Substring(0, path.Length - 6) + "ab"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } BuildPipeline.BuildAssetBundles( path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); } }
如图所示已经创建成功,
且我们想要打包的资源也已经存放再文件夹里面。
如何加载AssetBundle以及如何将AssetBundle整合到项目?
同样需要使用脚本,加载脚本如下:
AssetBundle ab = AssetBundle.LoadFromFile(Path);
Shader _shader = ab.LoadAsset<Shader>(Name);
这里的Path是根目录地址加包名:我这个项目就是 D:\CloudShaderTest\ab + "\shader";
加载包中的资源文件使用LoadAsset方法,尖括号内是资源的属性,Name则是资源名称:在我的项目里分别是<Shader> 和 sLit
注:打在AB包中的文件,会独立与母包再创建一份,所以使用AB包的项目资源都不要存储在Resouces目录下,避免资源重复(涉及文件的两种加载方式:1.Resouces,2.AssetBundle)
使用插件管理AssetBundle
除了上述代码控制AB包的导出外,我们可以使用Unity官方的插件Asset Bundle Browser,来实现对AssetBundle的可视化导出控制
插件下载地址如下:
https://github.com/Unity-Technologies/AssetBundles-Browser
之后可以在 Window->AssetBundle Browser打开面板
这里可以看到几个关键参数:
Build Target:对应的平台
Output Path: 打包后的地址
Clear Floders:是否清除文件夹后再进行打包(防止打包后文件重复)
Copy to StreamingAssets:是否复制打包后的资源在Asset中
Compression:打包方式,一共有三种方式,None(不进行压缩),Standard Compression(标准压缩模式,对所有资源压缩,压缩后的体积最小,但是压缩与解压缩消耗时间也最多),Chunk Based Compression(基于块的压缩模式,只对使用到的资源块进行压缩,这允许在从AssetBundle读取数据时进行实时解压。使用该选项创建的AssetBundle在下载后以压缩的形式存储(在磁盘缓存或内存中))