1. 程式人生 > 實用技巧 >UE4 生成多個Pak

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;
}

配置項:

[MultiPaks]
Pak1="/Game/UI/"
Pak2="/Game/Blueprint/"
Pak3="/Game/Map/"