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