Unity热更新机制

前言

游戏上线后,难免会有一些测试阶段没发现的bug,bug这东西,可大可小。
如果出现重大bug,而又没有热更技术,那么我们为了修复bug就只能强制玩家去商店下载新包,那造成的玩家流失是非常可怕的。
而如果有热更,我们在发现问题的当天,只需要发布一个小补丁包,就能将问题修复了。

目录

  • 热更新的原理
  • 热更新的基本流程

热更新的原理

Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新。

Unity提供可以热更的方案就是AssetsBundle(后面简称AB)。资源、代码都可以打成AB包,放到服务器上,然后比对版本,进行热更。

Unity3D的热更新会涉及3个目录:游戏资源目录、数据目录、网络资源地址。

游戏资源目录:游戏的安装目录,如下所示

Mac OS或Windows:Application.dataPath + "/StreamingAssets";
IOS: Application.dataPath + "/Raw";
Android:jar:file://" + Application.dataPath + "!/assets/";

数据目录:由于“游戏资源目录”在Android和IOS上是只读的,不能把网上的下载的资源放到里面,所以需要建立一个“数据目录”,该目录可读可写。

不同平台下,“数据目录”的地址也不同,LuaFramework的定义如下:

Android或IOS:Application.persistentDataPath + "/LuaFramework"
Mac OS或Windows:C:/LuaFramework/
调试模式下:Application.dataPath + "/StreamingAssets/"

网络资源地址:又名服务器地址,是用来存放游戏资源的网址。

大体热更步骤如下图:

  • 步骤①第一次开启游戏后,程序将“游戏资源目录”的内容复制到“数据目录”中。(这个步骤只会执行一次,下次再打开游戏就不复制了)。
  • 步骤②游戏开启后,程序会从“网络资源地址”下载一些更新的文件到数据目录。
  • 步骤③游戏过程中的资源加载,都是从“数据目录”中获取、解包。

Unity热更新机制_第1张图片

这些目录包含着不同版本的资源文件,以及用于版本控制的Files.txt。Files.txt的内容如下图所示,里面存放着资源文件的名称和md5码。

接下来便要尝试代码热更新,让程序下载服务器上的lua文件,然后运行它。在说明热更新之前,需要先看看Unity3D热更新的一般方法。

程序会先下载服务器上的files.txt,然后与本地文件的md5码做比较,更新有变化的文件(步骤2)。

Unity热更新机制_第2张图片

二、热更新的基本流程

接下来讲一下热更的基本流程:热更分成2部分

  • 导出热更资源
  • 游戏流程热更

2.1、导出热更资源

  1. 打包热更资源的对应的md5信息(涉及到增量打包)
  2. 上传热更ab到热更服务器
  3. 上传版本信息到版本服务器

2.2、游戏流程热更

  1. 启动游戏
  2. 根据当前版本号,和平台号去版本服务器上检查是否有热更
  3. 热更服务器上下载md5文件,比对需要热更的具体文件列表
  4. 热更服务器上下载需要热更的资源,解压到热更资源目录
  5. 游戏运行加载资源,优先到热更目录中加载,再到母包资源目录加载

更新注意:

1. 要有下载失败重试几次机制;
2. 要进行超时检测;
3. 要记录更新日志,例如哪几个资源时整个更新流程失败。

3. md5信息

Unity热更新机制_第3张图片

这边md5文件存了信息,分别是ab路径、MD5值、未压缩文件大小、压缩文件大小。

4. 版本号管理

客户端版本号我们是4位来标识,假设是X.Y.Z.W,下面是XYZW值对应的意义:

X:【巨大版本号】这一位其实就是1,没事一般不会动他,除非有太巨大的变化,目前反正还是1;
Y:【整包更新版本号】:我们游戏一般一个月会有一个比较大的版本迭代,这种版本会走商店,每次提交Y值+1;
Z:【服务器协议版本号】,一个月度版本周期内,万一SDK有问题或者C#层有发现bug,需要更新商店,这一位会+1,这里单独留一个Z处理这种商店版本号,是因为不想影响Y值,而商店提交新包要求版本号必须有增加,buildNum也是商店要求必须要升的;
W:【编译版本号\热更版本号】,每次热更都+1 。
【第2位加1之后,3、4位全部清0】

比如目前商店版本号是1.1.0.0,这个版本我们热更了3次后,版本号就变成1.1.0.3,

这时候发现好像C#层有一点bug必须要修复,那打一个1.1.1.3提交商店,1.1.1.3包里的资源和1.1.0.3的资源是一模一样的,这之后如果有第4次热更,那热更包的版本号就是1.1.1.4。

后面在说到检测热更的时候会用到以上版本号信息。


2020.12.11 XAsset 开箱试玩

使用教程:xasset入门指南 - TA养成记 、默默的奶爸:XASSET 4.0入门指南

自己实践的代码:Aver58/TeddyFrameWork

实践步骤:

  1. 网上HFS工具,这是一个本地的资源服务器,我们可以用它做实验
  2. 将打包出来的bundle上传到本地文件服务器
  3. 然后就可以用浏览器的http请求指定文件路径,获取文件
  4. XAsset的热更流程大致就以下这样,大家搭建的时候可以参考一下

Unity热更新机制_第4张图片

参考:

具体实践见:ToLua热更新之LuaFramework框架之代码热更新(一)_居安思危,游戏人生。-CSDN博客

Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建 - 子非鱼` - 博客园

这里推荐芳芳大佬写的热更课程,学到蛮多东西:成熟的Unity热更新以及版本管理的解决方案

你可能感兴趣的:(unity,游戏引擎,android)