首页 > Unity > Unity3D > 用AssetBundle实现动态更新
2016
01-10

用AssetBundle实现动态更新

通过AssetBundle可以在游戏上线后及时的对线上版本修复bug、调整配置以及添加新功能,另外也可以尽量减小首发版本的容量从而降低推广费用。

使用AssetBundle主要分打包、更新及加载三步:

打包:

不存在依赖关系的资源,一般是策划表格导出的配置文件–>Config.ab

BuildPipeline.PushAssetDependencies();

—-所有运行时需要的代码及shader–>Common.ab

—-BuildPipeline.PushAssetDependencies();

——–所有公用美术资源–>Common_Art.ab

——–所有音频资源–>Common_Audio.ab

——–BuildPipeline.PushAssetDependencies();

————特效prefab进行打包(可以都打包到一起)–>FX.ab

————每个角色的prefab进行打包,打包前调用一次PushAssetDependencies();,打包后调用一次PopAssetDependencies();

——–BuildPipeline.PopAssetDependencies();

——–BuildPipeline.PushAssetDependencies();

————每个图集prefab分别打包–>UIAtlas_*.ab

————每个字体分别打包–>UIFont_*.ab

————每个不打入图集在UITexture中使用的图片分别打包–>UITexture_*.ab

————每个UIPanel的prefab分别打包–>UIPanel_*.ab,打包前调用一次PushAssetDependencies();,打包后调用一次PopAssetDependencies();

——–BuildPipeline.PopAssetDependencies();

——–BuildPipeline.PushAssetDependencies();

————每个场景.unity文件分别打包–>Scene_*.ab

——–BuildPipeline.PopAssetDependencies();

—-BuildPipeline.PopAssetDependencies();

BuildPipeline.PopAssetDependencies();

以上是简单的打包流程,打包assetbundle文件时用:

BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.UncompressedAssetBundle

打包场景时: BuildAssetBundleOptions.UncompressedAssetBundle

打包完后要采用LZMA压缩,具体压缩方法: http://www.xuanyusong.com/archives/3095

压缩完后可以再加密一次(具体方法以后补上)

加密完后要计算MD5:

还要再计算下文件大小:

还要记录每个assetbundle文件的直接依赖的assetbundle文件(不包括再往上依赖的)

这些信息可以存进如下数据结构中:

如果assetbundle里只包含一个prefab(或者其他贴图、声音)文件,将该prefab路径指定给mainAssetPath,如果包含多个的话就加进assetPaths里

然后需要讲这些信息序列化进bundle.json中:

然后就可以将这些assetbundle文件及bundle.json上传至文件服务器上,部分文件可以放进StreamingAssets文件夹中,比如游戏更新界面所需要的资源。


 

更新:

游戏启动时可以向登录服务器发起请求获得游戏服务器地址及文件服务器地址,先将StreamingAssets文件夹中的bundle.json和assetbundle文件解密解压至Application.persistentDataPath中(可以先判断是否这些文件本地都有了,有的话就不需要再执行这一步了),然后打开更新界面,对比本地bundle.json与服务器bundle.json文件,如果本地assetbundle文件的md5与服务器中的不同则下载并解密解压(bundle.json里包含每个文件的大小信息,下载界面可以显示总体下载进度),完全下载完后再将服务器上的bundle.json文件替换本地的。

资源下载的时候可以直接使用WWW下载也可以开线程用WebClient下载(这种方式可以拿到更详细的下载信息显示在下载界面)


 

使用:

可以直接使用AssetBundle.CreateFromFile来加载文件,跟Resources.Load挺像,为方便调试,Editor模式下采用Resouces.Load方式来加载资源,示例代码如下:

以上主要是针对资源的更新,lua的更新类似,相关用法以后补上。

PS: 游戏项目刚开始时最好就开始采用AssetBundle来做,规范好资源文件路径方便打包。

最后编辑:
作者:maosongliang
这个作者貌似有点懒,什么都没有留下。