19 #include "AssetRegistry/AssetRegistryModule.h"
21 #include "Engine/ObjectLibrary.h"
23 #include "Engine/StaticMesh.h"
25 #include "Kismet/BlueprintFunctionLibrary.h"
27 #include "Materials/Material.h"
29 #include "PhysicalMaterials/PhysicalMaterial.h"
31 #include "UObject/Package.h"
33 #include "UObject/SavePackage.h"
39 #include "AssetToolsModule.h"
41 #include "IAssetTools.h"
43 #include "UObject/ConstructorHelpers.h"
55 #include "logUtilities.h"
59 #include "RRAssetUtils.generated.h"
82 class RAPYUTASIMULATIONPLUGINS_API
URRAssetUtils :
public UBlueprintFunctionLibrary
94 static FAssetRegistryModule& assetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(
"AssetRegistry");
96 return assetRegistryModule.Get();
104 static IAssetTools& GetAssetToolsModule()
110 static FAssetToolsModule& assetToolsModule = FAssetToolsModule::GetModule();
112 return assetToolsModule.Get();
136 return FPackageName::TryConvertLongPackageNameToFilename(
138 InAssetPath, OutAssetFilePath, FPackageName::GetAssetPackageExtension());
150 UPackage* assetPackage = InAssetData.GetPackage();
152 if (
nullptr == assetPackage)
162 LogRapyutaCore, Error, TEXT(
"[%s] asset's package is not available!"), *InAssetData.AssetName.ToString());
174 FString packageFileName;
176 if (
false == FPackageName::DoesPackageExist(assetPackage->GetName(),
178 #
if ENGINE_MAJOR_VERSION < 5
192 UE_LOG_WITH_INFO(LogRapyutaCore,
196 TEXT(
"[%s] asset's package [%s] does not exist!"),
198 *InAssetData.AssetName.ToString(),
216 TUniquePtr<FArchive> packageReader = TUniquePtr<FArchive>(IFileManager::Get().CreateFileReader(*packageFileName));
218 if (
nullptr == packageReader)
222 UE_LOG_WITH_INFO(LogRapyutaCore, Error, TEXT(
"Failed creating Package reader for package [%s]!"), *packageFileName);
230 FPackageFileSummary packageSummary;
232 *packageReader << packageSummary;
238 #if ENGINE_MAJOR_VERSION < 5
240 const int32 packageFileVersionUE = packageSummary.GetFileVersionUE4();
244 const int32 packageFileVersionUE = packageSummary.GetFileVersionUE().ToValue();
252 if (packageFileVersionUE <
static_cast<int32
>(VER_UE4_OLDEST_LOADABLE_PACKAGE))
266 TEXT(
"[%s] asset was saved by a previous UE version which is not backward compatible with this one."
268 "Min Required version: [%d] vs Package version: [%d]"),
270 *InAssetData.AssetName.ToString(),
272 static_cast<int32
>(VER_UE4_OLDEST_LOADABLE_PACKAGE),
274 packageFileVersionUE);
286 #if ENGINE_MAJOR_VERSION < 5
288 const int32 packageFileVersionUEGlobal = GPackageFileUE4Version;
292 const int32 packageFileVersionUEGlobal = GPackageFileUEVersion.ToValue();
298 if (packageFileVersionUE > packageFileVersionUEGlobal)
306 UE_LOG_WITH_INFO(LogRapyutaCore,
310 TEXT(
"[%s] asset was saved by a newer UE version [%d], which is not forward compatible "
312 "with the current one[%d]"),
314 *InAssetData.AssetName.ToString(),
316 packageFileVersionUE,
318 packageFileVersionUEGlobal);
330 if (
false == FEngineVersion::Current().IsCompatibleWith(packageSummary.CompatibleWithEngineVersion))
338 UE_LOG_WITH_INFO(LogRapyutaCore,
342 TEXT(
"[%s] asset's package's version [%s] is incompatible with the current UE version[%s]!"),
344 *InAssetData.AssetName.ToString(),
346 *packageSummary.CompatibleWithEngineVersion.ToString(),
348 *FEngineVersion::Current().ToString());
362 static bool IsAssetDataListValid(
const TArray<FAssetData>& InAssetDataList,
bool bLoadedCheck,
bool bIsLogged =
false)
366 bool bIsAssetValid =
true;
368 for (
const auto& assetData : InAssetDataList)
374 if (
false == assetData.IsValid())
378 bIsAssetValid =
false;
386 LogRapyutaCore, Error, TEXT(
"[%s] asset data info is invalid!"), *assetData.AssetName.ToString());
392 else if (
false == IsAssetPackageValid(assetData, bIsLogged))
396 bIsAssetValid =
false;
400 else if (bLoadedCheck && (
false == assetData.IsAssetLoaded()))
404 bIsAssetValid =
false;
412 LogRapyutaCore, Error, TEXT(
"[%s] asset failed to be loaded!"), *assetData.AssetName.ToString());
422 if (
false == bIsAssetValid)
430 assetData.PrintAssetData();
472 TArray<FAssetData>& OutAssetDataList,
474 bool bHasBPAsset =
false,
476 bool bIsFullLoad =
false)
482 UObjectLibrary* objectLibrary = UObjectLibrary::CreateLibrary(T::StaticClass(), bHasBPAsset, GIsEditor);
488 objectLibrary->bIncludeOnlyOnDiskAssets =
false;
494 objectLibrary->bRecursivePaths =
true;
496 objectLibrary->LoadAssetDataFromPath(InAssetsPath);
502 objectLibrary->LoadAssetsFromAssetData();
508 objectLibrary->GetAssetDataList(OutAssetDataList);
510 ensure(IsAssetDataListValid(OutAssetDataList, bIsFullLoad,
true));
544 if (InAssetPath.IsEmpty())
548 UE_LOG_WITH_INFO(LogTemp, Error, TEXT(
"[EMPTY PATH!"))
556 return LoadObject<T>(Outer, *InAssetPath);
580 return ConstructorHelpers::FObjectFinderOptional<T>(InAssetPath).Get();
606 ConstructorHelpers::FClassFinder<T> classFinder(InClassAssetPath);
608 return classFinder.Class;
626 static bool DoesAssetExist(
const FString& InAssetPath,
bool bOnDiskAssetOnly =
false)
630 const auto& assetPackageName = FName(*InAssetPath);
632 return bOnDiskAssetOnly ? GetAssetRegistry().GetAssetPackageDataCopy(assetPackageName).IsSet()
634 : GetAssetRegistry().HasAssets(assetPackageName);
652 static UPackage* CreatePackageForSavingToAsset(
const TCHAR* InPackageName,
654 const EPackageFlags InPackageFlags = (PKG_NewlyCreated | PKG_RuntimeGenerated));
682 static UObject* SaveObjectToAssetInModule(UObject* InObject,
686 const FString& InAssetUniqueName,
688 const TCHAR* InModuleName,
690 bool bSaveDuplicatedObject =
false,
692 bool bInStripEditorOnlyContent =
false,
694 bool bInAsyncSave =
true,
696 bool bInAlwaysOverwrite =
false);
724 static UObject* SaveObjectToAsset(UObject* InObject,
726 const FString& InAssetPath,
728 bool bSaveDuplicatedObject =
false,
730 bool bInStripEditorOnlyContent =
false,
732 bool bInAsyncSave =
true,
734 bool bInAlwaysOverwrite =
false);
752 static bool SavePackageToAsset(UPackage* InPackage,
756 bool bInAsyncSave =
true,
758 bool bInAlwaysOverwrite =
false);
778 static UClass* FindBlueprintClass(
const FString& InBlueprintClassName);
792 const FTopLevelAssetPath classAssetPath(InClassPathName);
794 if (UClass* foundClass = FindObject<UClass>(classAssetPath))
806 TArray<FAssetData> outAssets;
808 GetAssetRegistry().GetAssetsByClass(classAssetPath, outAssets);
810 return (outAssets.Num() > 0) ? outAssets[0].GetClass() :
nullptr;
840 static UClass* CreateBlueprintClass(UClass* InParentClass,
842 const FString& InBlueprintClassName,
844 const TFunction<
void(UObject* InCDO)>& InCDOFunc =
nullptr,
846 const bool bInSaveBP =
false,
848 const FString& InBPBasePath = TEXT(
""));
868 static UBlueprint* CreateBlueprintFromActor(AActor* InActor,
870 const FString& InBlueprintClassName,
872 const bool bInSaveBP,
874 const TFunction<
void(UObject* InCDO)>& InCDOFunc =
nullptr);