UE4.27.2 UnrealPAK Repack 功能分析
2025-05-20 22:58:09

从入口进来

1
2
3
// Engine/Source/Developer/PakFileUtilities/Private/PakFileUtilities.cpp: 

bool ExecuteUnrealPak(const TCHAR* CmdLine)

进到 Repack 选项这个 if else

这里可以读取相同文件名后缀所有 pak 文件,输出的 pak 文件一一对应

然后可以配置 ExcludeDeleted 选项,是否跳过输入的 pak 文件中被删除的内容,这个很有意思

然后就是具体的重新打包的逻辑

1
2
3
// Engine/Source/Developer/PakFileUtilities/Private/PakFileUtilities.cpp: 

bool Repack(const FString& InputPakFile, const FString& OutputPakFile, const FPakCommandLineParameters& CmdLineParameters, const FKeyChain& InKeyChain, bool bIncludeDeleted)

这里一开始就是剔除掉删除的文件的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (ExtractFilesFromPak(*InputPakFile, Hashes, *TempDir, false, InKeyChain, nullptr, &Entries, &DeletedEntries, &OrderMap, &EncryptionKeys, &bAnySigned))
{
TArray<FPakInputPair> FilesToAdd;
CollectFilesToAdd(FilesToAdd, Entries, OrderMap, CmdLineParameters);

if (bIncludeDeleted)
{
for( const FPakInputPair& Entry : DeletedEntries )
{
FilesToAdd.Add(Entry);
}
}
else if (DeletedEntries.Num() > 0)
{
UE_LOG(LogPakFile, Display, TEXT("%s has %d delete records - these will not be included in the repackage. Specify -IncludeDeleted to include them"), *InputPakFile, DeletedEntries.Num() );
}

具体进到 ExtractFilesFromPak 里面是可以看到,如果传入的 OutDeletedEntries 不是 null,那么也会把源 PAK 中 tag 被标记为 deleted 的文件给解压出来

之后就是重新压缩的事了

其实比较简单,但是就是需要走他自己的一些特殊处理的流程

本来我想修改这个函数来实现自己的目的,但是这是一个私有文件

如果要把函数暴露出来,就要改源码

如果是一些非得改不可的功能,那公开了也行

但是仔细考虑的话,其实我从 cpp 调用 command 也不是不能接受

因为已经看过了 cpp 的 repack 实现,跟我自己通过 command 解压再压缩是一样的