UE4 生成多個Pak
阿新 • • 發佈:2020-12-13
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/"