UE4 生成多个Pak

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
原文地址:https://www.cnblogs.com/rpg3d/p/14130335.html