这两天在看 UE 打包 Patch 作为热更的方案,UE 打包 Patch 的逻辑是这样的:
- 如果在版本 1.0 中,场景
Scene01
中对资源 A 有直接引用(放在场景中),在修改了 A 资源之后,打包 Patch0.1,想要让场景Scene01
中资源 A 的改动也生效,则需要把Scene01
也需要打到 Patch 中,因为是直接放置在场景中的,场景记录了该资源 A 的引用信息,这个不会随着资源 A 的更新而更新,加载时会产生AsyncLoading.cpp
中的报错。
1 | [2019.11.13-06.03.27:766][68]LogLinker: Warning: The file '../../../GWorld/Content/PAK/Cube.uasset' contains unrecognizable data, check that it is of the expected type. |
解决这个问题的办法是通过 SoftClassReference
动态加载资源,比如直接 SpawnActorFromClass
直接指定 Class 为具体的类也是会产生上面的错误,但是用 SoftClassReference
可以避免这个错误(因为 SoftClassReference
本质就是存了个路径):
- 如果在版本 1.0 中,资源 A 引用了其他资源 B,在 Patch1.0 中将资源 A 中引用的 B 换为了资源 C,则该 Patch 的 pak 中会有资源 A/B/C 三个,因为资源的引用关系变了,但是如果不改动引用关系只是改动 B 中的信息,然后只 Patch 资源 B 是可以的。
直接使用 Unreal.pak
将Cooked
的资源打包为 pak
文件需要注意一点:修改 Mount 的路径。
如果说直接使用下列命令:
1 | $ UnrealPak.exe New_0_P.pak -create=D:\GWorldClient\Saved\Cooked\WindowsNoEditor\GWorld\Content\PAK |
则打出来的 pak 的 Mount 路径为:
1 | D:\GWorldClient\Saved\Cooked\WindowsNoEditor\GWorld\Content\PAK |
而查看使用引擎打包的 Pak 和 patch 的 pak 都是相对路径的,这个性格对路径就是 UE 的工程里资源的路径:
1 | D:\GWorldPackage\WindowsNoEditor\GWorld\Content\Paks>UnrealPak.exe GWorld-WindowsNoEditor.pak -list |
解决方案 是可以通过 UnrealPak.exe
的-create
来指定一个 txt 文件来指定某个资源的绝对路径换算为相对路径:
1 | "D:\GWorldClient\Saved\Cooked\WindowsNoEditor\GWorld\Content\PAK\BasicShapeMaterial_3.uasset" "../../../GWorld/Content/PAK/BasicShapeMaterial_3.uasset" -compress |
可以看作有数列的表,第一列是资源的 绝对路径 ,第二列是 该绝对路径资源对应的相对路径 ,后面是 参数 (可以是-compress
/-encrypt
),生成的代码在Source/Programs/AutomationTool/Script/CopyBuildToStagingDirectory.Automation.cs
中。
1 | D:\>UnrealPak.exe D:\NEW_6_P.pak -create="D:\GWorldClient\Saved\Cooked\WindowsNoEditor\GWorld\Content\New.txt" |
检查打包出来的New_6_P.pak
:
1 | D:\>UnrealPak.exe NEW_6_P.pak -list |
可以看到变成了相对路径了。