UE4默认情况下打包生成一个Pak,这对于小型游戏足够了,但对于大型游戏不太方便,
单个pak文件太大对于打补丁非常不友好(非UE4默认Patch方案, 而是Xdelta3/BSDiff类方案),
UE4内置了拆分Pak的功能,是按照资源类型来划分, 感觉不太直观, 习惯上更期望安装目录划分pak,
要实现安装目录划分,最简单的办法就是修改AutomationTool,在执行打包pak时,读取自定义配置,
根据文件目录个配置项,拆分为多个pak. 这在源码版引擎上操作很友好,但在安装版引擎就不方便了,
每次引擎更新都会覆盖对应的cs文件,反复修改很烦.
故尝试通过其自带拆分pak的功能来实现安装目录分pak, 发现其代码中预留了自定义操作,
只需要继承AssetManager,复写GetPackageChunkIds() 函数, 根据自定义配置来决定资源所属pak即可.
注意:要将项目的AssetManager设置为自定义的AssetManager类方可生效.
代码中读取ini应该可以优化,不必每次重新读取(只是需要额外处理刷新ini的时机)
bool UMyGameAssetManager::GetPackageChunkIds(FName PackageName, const class ITargetPlatform* TargetPlatform, const TArray<int32>& ExistingChunkList, TArray<int32>& OutChunkList, TArray<int32>* OutOverrideChunkList /*= nullptr*/) const
{
TArray<FString> Lines;
GConfig->GetSection(TEXT("MultiPaks"), Lines, GGameIni);
int32 Idx = 0;
for (auto It : Lines)
{
++Idx;
TArray<FString> KVStr;
It.ParseIntoArray(KVStr, TEXT("="));
if (KVStr.Num() == 2 && PackageName.ToString().StartsWith(KVStr[1]))
{
OutChunkList.Add(Idx);
return true;
}
}
OutChunkList.Add(0);
return true;
}
配置项:
DefaultGame.ini
[/Script/UnrealEd.ProjectPackagingSettings]
bGenerateChunks=True
[MultiPaks]
+Pak0="/Game/Startup/"
+Pak1="/Game/GameUI/"
+Pak2="/Game/Blueprint/"
+Pak3="/Game/Maps/"
DefaultEngine.ini
[/Script/Engine.Engine]
AssetManagerClassName=/Script/MyGame.MyGamaeAssetManager