智能热更新插件
文档 下载 评论(0)
主版本热更新 和 修改C++代码

目录
一.配置基础信息
二.上传补丁OSS数据到数据库
三.编写热更新代码版本控制代码
四.热更C++ 和自定义类型


哈喽,大家好 我叫人宅,很高兴和大家一起介绍一款智能插件。

这里我要重新声明一下,该插件可以为您解决80%热更问题,剩下20%是要与支付和数据库连用的,这个本插件有预留接口,可以接自己的服务器或者是我这边提供框架的第三方服务器源码,客户端是不能直接连接Mysql。 

为什么说它是智能的插件呢?

因为它集合

自定义烘培资源
资源打包
资源加密
资源上传
资源下载
主版本上传
dll上传
exe上传
自定义文本上传

在使用智能热更新插件的时候你需要如下插件

热更新插件组
专门进行蓝图读取文本

SimpleUnrealPak:是可以独立打包资源项目烘培资源加密资源的插件;

SimpleOSS:可以和阿里云OSS服务器连用实现数据存储,数据热更的效果,速度极快。

SimpleMySQL:在热更中起到管理员DLC字段控制,存在于编辑器,客户端不存在Mysql插件.

SimpleHotUpdate:热更新总插件,主要作用是版本控制,该插件一方面为管理员使用,另一方面是为客户端进行热更使用。

SimpleFileHelper:是蓝图专门用作读取文本操作的插件 详细操作参考 :SimpleFileHelper技术精讲

该工具的原理图:

智能热更新原理图

现在我们来讲解一下该插件怎么使用。

我们现在用4.25.3版本为例,这个版本目前有很多bug。

一.配置基础信息

a.首先来到我们的UE4Edit下点击Edit:

b.来到Simple Unreal Pak Settings下,确保bCook是勾选的(它的意思就是使用我们烘培好的资源,如果使用未烘培好的,那么只能在编辑器里面打开它),其他的保持默认,以后我们有机会详细讲解里面的参数是什么意思,现在只需要保持默认:

c.配置我们的阿里云的OSS账户信息信息。

如果不会OSS的可以参考 UE4OSS套件开发

详细配置可以参考如下文章 SimpleOSS学习文档

d.打开阿里云OSS 拿到ID和密钥:

e.拿到我们Endpoint

f.配置好了以后 我们来配置URL 和 OSS桶

在下面的位置:

g.别忘记三个地方都要点击这个


二.上传补丁OSS数据到数据库

a.先cook所有资源

或者是UE4自带的Cook

两种都可以:

b.完成后我们开始热更:

c.这里有Update patch ,Uninstall patch 一个是更新补丁 一个是卸载服务器补丁;

查看OSS服务器上传情况:

d.确认上传成功,现在我们来查看一下服务器版本,如下:

e.它是一段Json,记录 我将它进行美化如下:

{
	"Name": "V.1.0.0.2", //当前服务器的版本
	"Crc": "2849701A4E548E28DAC27997F5F51259",//与客户端进行校验的校验码 服务端是否更新
	"Content": [{
		"Len": 32920,//当前补丁大小
		"Link": "https:/serverversionmaster.oss-cn-beijing.aliyuncs.com/Patch/Mesh.pak",//补丁下载地址
		"Crc": "C853B261491794D8F51C58BDBD971595",//补丁校验 判断补丁是否更新
		"bDiscard": false,//该补丁是否被丢弃
		"PakVersionType": ""//当前散包的一个类型,0代表普通,1代表主版本
	}]
}

这个就是是我们服务器版本信息,客户端会通过该信息来判定自己需不需要更新

MutexVersion.con这个是管理员锁,如果有多个管理员上传版本,那么它就很重要,同样也限制客户端下载,比如在维护期间客户端会判定该锁是否开启,如果开启就弹出服务器维护警告。


三.编写热更新代码版本控制代码

a.我们在这里建立了一个UI和OSS对象:

b.UI建立很简单,鼠标右键,方法如下:

c.OSS对象,你可以使用默认的OSS对象或者是通过下面蓝图直接创建一个

d.创建好后 命名为OSS

e.并且打开它

在这里,我们提供了多个函数进行扩展。你可以自定义一个怎么样的热更新;

他们的执行顺序如下

Start Init Version       //开始更新版本 其中包含必要的注册信息以及要更新的版本信息。
End Init Version         //结束更新版本
Start Update Version     //这个函数标志着开始进行版本迭代更新了
Start Download           //开始进行下载当前版本 并且发送一个包的名字
Downloading              //下载中,会返回一个百分比以及总数,和接受总数
End Downloading          //结束下载
End Update Version       //所以的任务都结束后执行该接口

f.OSS的其他函数

1.它可以获取当前的版本名称,注意,它的使用需要在EndInitVersion结束后使用。

GetCurrentVersions()

2.CreateVersionControlObject 它可以帮助我们创建一个版本控制对象,用于接受服务器的版本信息。

CreateVersionControlObject()

3.InitVersion 它可以帮助我们初始化版本,进行版本迭代,非常有用

4.它可以将字节进行转换,这里是按照字节数的多少进行转换 比如将KB转变MB或者GB

5.这个是URL,客户端需要一个URL接口来提供相关服务。客户端同这个URL来对OSS服务器进行匿名访问;

g.写版本控制代码 :

1.现在我们来到UI这边,加入如下的控件:

2.然后我们需要将屏幕变小,让全屏的效果效时,变成窗口

3 然后创建对象作为我们的版本控制

4.绑定版本代理

EndInitVersion:          //版本初始化后执行
Start Download           //开始进行下载当前版本 并且发送一个包的名字
Downloading              //下载中,会返回一个百分比以及总数,和接受总数
End Downloading          //结束下载

5.绑定URL和最后的执行:

url :负责客户端进行匿名对象下载
InitVersion:作为客户端执行下载的标志

我们现在来看看这几个代理绑定的具体函数应该怎么写

6.InitVersion

7.StartDownloading

8.Downloading

9.Endloading

l0.全家福

11.最后就把它添加到屏幕上即可,可以在关卡蓝图上添加

12.运行完毕如下:

13.会在工程的项目根目录下生成如下内容

.simple 里面存储着当前的版本,这个版本是从服务器下载的,如果你想重新看看下载情况,或者重新测试下载代码,可以删除这个文件。

我们现在已经上传了一个版本,现在我们来做读取代码:

我们读取代码是通过配表的方式来读取,就拿下面的模型为例:

14.现在我们来到我们的UI里面,来完善我们的EndLoading Version

这次我们用配表的方式来实现,

它是我们下载完毕后表的路径,这个表需要由策划来完成,我这边直接用最简单的txt表达;

这个是我们的资源对象:

对模型进行ctrl + c 就得到了 如下路径

StaticMesh'/Game/Mesh/1M_Cube_2.1M_Cube_2'

 把路径进行修改 就变成如下内容 下面是我们的表

这里我们用到了以下节点:

它可以从我们的Patchs里面区拿pak,并且把该内容进行解析。

注意,我们用的是导航数据拿到半径为500的随机 生成一个点,重点是我们要生成一个模型:

15.你要在关卡里面布置好导航

16.现在我们打一个基础包,这个包需要去掉Mesh文件,把引擎关闭,然后移除Mesh;

好,可以看到我们已经移除了:

这是目前最原始的版本:

17.打最基础的项目运行包

打好了,这个作为我们最基础的包,可以多复制几个:


四.热更C++ 和自定义类型

现在我们还要测试主版本,也就是我们要往UE4里面加C++代码,希望客户端也能得到更新,好我们来看看:

添加完后,点击编译重新启动即可。

a.现在我们再打一个包,这个包是包含我们C++代码的。

现在打包成功,这个版本作为我们下一个要更新的版本,先放在这边不要上传。

b.我们来测试一下热加载,我们在前面的章节中上传过一个版本,这个版本是我们的mesh,这次我们上传列表

c.来到我们编辑器界面,点击箭头所指示的那个按钮

d.来到下面,我们要传递我们的表,添加额外依赖项:

e.添加完毕后更新主版本,这个主版本里面只包含了一张表格,并没有什么dll和pak,点击update main version

上传成功后检查 OSS服务端,确实成功了。

现在我们再看看它的服务器版本类型是什么

{
	"Name": "V.1.0.0.3",
	"Crc": "8B837CDE45292E15A0CA83ADD95025F3",
	"Content": [{
		"Len": 32920,
		"Link": "https:/serverversionmaster.oss-cn-beijing.aliyuncs.com/Patch/Mesh.pak",
		"Crc": "C853B261491794D8F51C58BDBD971595",
		"bDiscard": false,
		"PakVersionType": "0"
	}, {
		"Len": 86,
		"Link": "https:/serverversionmaster.oss-cn-beijing.aliyuncs.com/Patch/TableActor.txt",
		"Crc": "3397C97540AE54173AD5FA890A173DE5",
		"bDiscard": false,
		"PakVersionType": "0"//普通版本
	}]
}

单独上传自定义的依赖项,它就是一个普通的版本。

现在我们来启动我们的客户端测试一下,是否可以加载到我们的pak

现在我们开始热更加载pak,因为Ue4 2.5有很多bug,材质丢失,这个是引擎bug。

现在我们来测试主版本更新,是否可以更新我们的HelloWorld

e.打开主板,上传主版本的pak和 exe 我们在 QQQ里面打过一个版本包 如下

点击后进程被卡住了,这个是正常的,因为在上传,以后智能热更新插件会出一个异步上传,可以直接看到进度,这个不是死机。

f.主版本的更新需要重启游戏,也就是说,先下载,下载完毕后 游戏要重启,因为我们改动了C++,或者改动了主版本里面的资源,那么我们就需要通过重启来将原来的资源进行替换。

OSS服务器上的版本信息

查看当前服务器版本

{
    "Name":"V.1.0.0.5",
    "Crc":"2668EE4D474A9D557E8FA8BCA45EBFB3",
    "Content":[
        {
            "Len":32920,
            "Link":"https:/serverversionmaster.oss-cn-beijing.aliyuncs.com/Patch/Mesh.pak",
            "Crc":"C853B261491794D8F51C58BDBD971595",
            "bDiscard":false,
            "PakVersionType":"0"
        },
        {
            "Len":86,
            "Link":"https:/serverversionmaster.oss-cn-beijing.aliyuncs.com/Patch/TableActor.txt",
            "Crc":"B58C1C7A4D8BF3C7D150A1A46B63AFC4",
            "bDiscard":false,
            "PakVersionType":"0"
        },
        {
            "Len":207636924,
            "Link":"https:/serverversionmaster.oss-cn-beijing.aliyuncs.com/Patch/TestA-WindowsNoEditor.pak",
            "Crc":"6521F2444A19CCC05864B38571FE5087",
            "bDiscard":false,
            "PakVersionType":"1"//主版本 需要重启游戏进行更新替换
        },
        {
            "Len":139095552,
            "Link":"https:/serverversionmaster.oss-cn-beijing.aliyuncs.com/Patch/TestA.exe",
            "Crc":"E872FBEB4AA910CD35B926A9263FD59F",
            "bDiscard":false,
            "PakVersionType":"1"//主版本 需要重启游戏进行更新替换
        }
    ]
}

g.点击客户端游戏我们来查看状态:

点击后正确读取了我们的C++ Hello world

以上就是我们为大家展示的热更新,如果希望当前工具有什么功能或者需要改进的意见欢迎留言,该UE4插件人宅会终身维护。

发表评论

一.商业版本和学习版本的对比

二.您还未登陆哦

三.该资源出自以下课程