主版本热更新 和 修改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插件人宅会终身维护。
支持4.26吗
不支持,目前正在做兼容处理
可以开发票吗
可以开
Ue5 能用了吗
可以