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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM