找回密码
 立即注册
查看: 655|回复: 0

UE4智能热更新插件

[复制链接]
发表于 2022-3-10 11:58 | 显示全部楼层 |阅读模式


主版本热更新 和 修改C++代码

目录
一.配置基础信息
二.上传补丁OSS数据到数据库
三.编写热更新代码版本控制代码
四.热更C++ 和自定义类型
<hr/>哈喽,大家好  我叫人宅,很高兴和大家一起介绍一款智能插件。
这里我要重新声明一下,该插件可以为您解决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.别忘记三个地方都要点击这个


<hr/>二.上传补丁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这个是管理员锁,如果有多个管理员上传版本,那么它就很重要,同样也限制客户端下载,比如在维护期间客户端会判定该锁是否开启,如果开启就弹出服务器维护警告。
<hr/>三.编写热更新代码版本控制代码


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.打最基础的项目运行包


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


<hr/>四.热更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插件人宅会终身维护。
五.热更新视频完整免费版本


六.热更新智能插件的学习版本。

目前提供学习版本的插件,编辑器只支持DebugGameEditor模式,注意不要重新编译,点击编译即可
提取码:wuo6
七.热更新插件开发教程地址


八.作者其他文章

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-23 08:05 , Processed in 0.096046 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表