12/27/2020
文章目录
前言
最近在学习热更新,即如何对游戏打补丁,找到一款不错的插件HotPatcher来提升这方面的知识 补丁插件讲解或者知乎链接
从中可以获取的知识:
- 如何使用Slate C++来制作UE4的界面
- 打包或者打补丁的过程
- Commandlet源码的运用和学习
为什么需要热更新,当游戏上架之后,如果出现资源问题,我们不能要求客户重新下载所有资源,我们需要上传体积小并只更新有问题的资源,同时游戏也只加载更新过后的资源,那么客户也只需要下载更新之后的资源。
打包(Package)
UE4的打包方式有很多种,但是根本离不开UnrealPak.exe工具(\Engine\Binaries\Win64\UnrealPak.exe)
注意打包的资源是cooked之后的资源,即与平台相关的资源
资源类型
资源的种类有很多,都放在Content目录文件中
- 模型材质(.uasset)
- 地图(.umap)
- 动画
- 蓝图
当结束Cook之后,资源都会存在这个路径下[ProjectFile]/Saved/[WindowsNoEditor]/[ProjectName]/Cooked/
D:\UE4\UE_4.25\Engine\Binaries\Win64\UE4Editor-Cmd.exe D:\unrealEngin4WorkStation\TestPatch\TestPatch.uproject -run=Cook -TargetPlatform=WindowsNoEditor -fileopenlog -unversioned -abslog=D:\UE4\UE_4.25\Engine\Programs\AutomationTool\Saved\Cook-2020.12.19-16.15.26.txt -stdout -CrashForUAT -unattended -NoLogTime
s -UTF8Output
查阅Output Log可以发现Cook执行的命令
- run:Cook
- TargetPlatform:WindowsNoEditor
- unversioned:没有版本
- abslog:输出文件路径
第一次Cook数据需要花费较长的时间,之后有Cook数据可以使用-iterative指令在已有的资源迭代更新
执行打包命令
D:\unrealEngin4WorkStation\TestPatch\TestPatch.uproject D:\unrealEngin4WorkStation\TestPatch\Saved\StagedBuilds\WindowsNoEditor\TestPatch\Content\Paks\TestPatch-WindowsNoEditor.pak -create="C:\Users\Alex\AppData\Roaming\Unreal Engine\AutomationTool\Logs\D+UE4+UE_4.25\PakList_TestPatch-WindowsNoEditor.txt"
-cryptokeys=D:\unrealEngin4WorkStation\TestPatch\Saved\Cooked\WindowsNoEditor\TestPatch\Metadata\Crypto.json -order=D:\unrealEngin4WorkStation\TestPatch\Build\WindowsNoEditor\FileOpenOrder\CookerOpenOrder.log -patchpaddingalign=2048 -platform=Windows -compressionformats= -multiprocess -abslog="C:\Users\Alex\AppData\Roaming\Unreal Engine\AutomationTool\Logs
\D+UE4+UE_4.25\UnrealPak-TestPatch-WindowsNoEditor-2020.12.19-16.25.30.txt"
[ProjectName]\Package\WindowsNoEditor\TestPatch\Content\Paks存储了Cooked资源内容和路径搜索
这串命令行有两个输出文本,一个叫PakList_TestPatch-WindowsNoEditor.txt这个文件记录加载和挂载资源的路径并由.pak文件保存
HotPatcher插件
最重要的函数之一:DoExport
- 获取release.json中的数据
- 获取资源信息(ExportReleaseVersionInfo函数)
- 输出数据到外部文件
获取资源信息(GetAssetData)
//ReleaseProxy.h
//PatcherProxy.h
// DoExport函数中的ExportReleaseVersionInfo 函数
//HotPatcher插件最重要的函数,如何导出资源信息
#include "ARFilter.h"
#include "AssetRegistryModule.h"
bool UFLibAssetManageHelperEx::GetAssetsData(const TArray<FString>& InFilterPackagePaths, TArray<FAssetData>& OutAssetData)
{
OutAssetData.Reset()