Bootstrap

UE4 C++(21):Cook单个资源

03/14/2020

Cook 单个资源

HotPatcher有一个函数叫做OnCookPlatform函数,需要资源名字和烘培平台就可以烘培资源了。简单把这个函数提取出来,我这边使用的是控制台来烘焙鼠标选中Content面板中的资源。

控制台烘培选中资源

控制台命令

传递烘培资源的平台,然后创建烘培的路径和开始烘培,最后完成烘培结果的显示。

  • GetCookedAssetDir():获取烘培路径
  • CookPackage():烘培函数,即生成文件
  • CreateSaveFileNotify():完成烘培结果显示
// Cheat command to load all assets of a given type
static FAutoConsoleCommand CookChoosedAssets(
	TEXT("CookChoosedAssets"),
	TEXT("Cook Choosed Assets in the Content Broweser"),
	FConsoleCommandWithArgsDelegate::CreateStatic(
		[](const TArray<FString>& Platforms)
		{
   
			//Cook A single asset

			//1. Get Asset Path + Name  on the ContentBrowser
			FContentBrowserModule& ContentBrowserModule = FModuleManager::Get().LoadModuleChecked<FContentBrowserModule>(TEXT("ContentBrowser"));
			TArray<FAssetData> AssetsData;
			ContentBrowserModule.Get().GetSelectedAssets(AssetsData);

			if (AssetsData.Num() == 0)
			{
   
				UE_LOG(LogTemp, Warning, TEXT("Plase Choose assets"));
				return;
			}

			TArray<UPackage*> AssetsPackage;
			for (const auto& AssetData : AssetsData)
			{
   
				AssetsPackage.AddUnique(AssetData.GetPackage());
			}

			for (auto CurrentPlatform : Platforms)
			{
   
				//Create folder and Cook assets
				FString CookedDir = FPaths::ConvertRelativePathToFull(FPaths::Combine(FPaths::ProjectSavedDir(), TEXT("Cooked")));
				for (const auto& AssetPacakge : AssetsPackage)
				{
   
					FString CookedSavePath = GetCookAssetsSaveDir(CookedDir, AssetPacakge, CurrentPlatform);

					//Start Cook Assets
					bool bCookStatus = CookPackage(AssetPacakge, Platforms, CookedDir);

					auto Msg = FText::Format(
						LOCTEXT("CookAssetsNotify", "Cook Platform {1} for {0} {2}!"),
						UKismetTextLibrary::Conv_StringToText(AssetPacakge->FileName.ToString()),
						UKismetTextLibrary::Conv_StringToText(CurrentPlatform),
						bCookStatus ? UKismetTextLibrary::Conv_StringToText(TEXT("Successfuly")) : UKismetTextLibrary::Conv_StringToText(TEXT("Faild"))
					);
					SNotificationItem::ECompletionState CookStatus = bCookStatus ? SNotificationItem::ECompletionState::CS_Success : SNotificationItem::ECompletionState::CS_Fail;
					CreateSaveFileNotify(Msg, CookedSavePath, CookStatus);
					UE_LOG(LogTemp, Warning, TEXT("Cook Single Assets, %s"), bCookStatus?TEXT("True"):TEXT("False"));

				}
			}
			UE_LOG(LogTemp, Warning, TEXT("Finish Cook Single Assets"));
		}), ECVF_Default);
;