mastertravels77 发表于 2022-6-17 20:05

【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/"网络资源地址:又名服务器地址,是用来存放游戏资源的网址。

大体热更步骤如下图:

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


这些目录包含着不同版本的资源文件,以及用于版本控制的Files.txt。Files.txt的内容如下图所示,里面存放着资源文件的名称和md5码。
接下来便要尝试代码热更新,让程序下载服务器上的lua文件,然后运行它。在说明热更新之前,需要先看看Unity3D热更新的一般方法。
程序会先下载服务器上的files.txt,然后与本地文件的md5码做比较,更新有变化的文件(步骤2)。


二、热更新的基本流程

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

[*]导出热更资源
[*]游戏流程热更
2.1、导出热更资源


[*]打包热更资源的对应的md5信息(涉及到增量打包)
[*]上传热更ab到热更服务器
[*]上传版本信息到版本服务器
2.2、游戏流程热更


[*]启动游戏
[*]根据当前版本号,和平台号去版本服务器上检查是否有热更
[*]从热更服务器上下载md5文件,比对需要热更的具体文件列表
[*]从热更服务器上下载需要热更的资源,解压到热更资源目录
[*]游戏运行加载资源,优先到热更目录中加载,再到母包资源目录加载
更新注意:
       1.要有下载失败重试几次机制;
       2.要进行超时检测;
       3.要记录更新日志,例如哪几个资源时整个更新流程失败。
3. md5信息





这边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。
后面在说到检测热更的时候会用到以上版本号信息。
<hr/>2020.12.11 XAsset 开箱试玩
使用教程:xasset入门指南 - TA养成记 、默默的奶爸:XASSET 4.0入门指南
自己实践的代码:Aver58/TeddyFrameWork
实践步骤:


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


参考:

具体实践见:ToLua热更新之LuaFramework框架之代码热更新(一)_居安思危,游戏人生。-CSDN博客
Unity3D热更新之LuaFramework篇--热更新原理及热更服务器搭建 - 子非鱼` - 博客园
这里推荐芳芳大佬写的热更课程,学到蛮多东西:成熟的Unity热更新以及版本管理的解决方案

ainatipen 发表于 2022-6-17 20:05

能结合框架里面代码 就更好了,哈哈
页: [1]
查看完整版本: 【Unity游戏客户端框架搭建】五、热更新