Solved with the code
UObject * AMyNativePlayerController::MyGetAsset(FAssetData & asset) {
if (!asset.IsValid())
{
return NULL;
}
UObject * Asset = FindObject<UObject>(NULL, *asset.ObjectPath.ToString());
if (Asset == NULL)
{
FString tmpstring = asset.ObjectPath.ToString();
UObject * InOuter = NULL;
ResolveName(InOuter, tmpstring, true, true);
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Magenta, TEXT("Now string is ") + tmpstring);
if (InOuter) {
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Magenta, TEXT("InOuter->GetName is ") + InOuter->GetName());
Asset = StaticFindObjectFast(UObject::StaticClass(), InOuter, *tmpstring);
}
if (Asset) {
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Black, TEXT("WOW I Have Load Something with StaticFindObjectFast!") + Asset->GetName());
return Asset;
}
Asset = (UObject *)StaticLoadObject(UBlueprint::StaticClass(), NULL, *asset.ObjectPath.ToString());
if (!Asset)
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT(" FAILED LOAD Object like BLUEPRINT By StaticLoadObject"));
else {
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Blue, TEXT(" LOADED like BLUEPRINT By StaticLoadObject"));
return Asset;
}
Asset = (UObject *)StaticLoadObject(UObject::StaticClass(), NULL, *asset.ObjectPath.ToString());
if (!Asset)
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT(" FAILED LOAD Object like UOBJECT By StaticLoadObject"));
else {
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Blue, TEXT(" LOADED like UOBJECT By StaticLoadObject"));
return Asset;
}
Asset = (UObject *)LoadObject<UBlueprint>(NULL, *asset.ObjectPath.ToString());
if (!Asset)
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT(" FAILED LOAD Object like BLUERPRINT "));
else {
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Blue, TEXT(" LOADED like BLUEPRINT By LoadObject"));
return Asset;
}
Asset = LoadObject<UObject>(NULL, *asset.ObjectPath.ToString());
if (!Asset)
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT(" EVEN FAILED LOAD Object like UOBJECT "));
else {
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Blue, TEXT(" LOADED like UOBJECT By LoadObject"));
return Asset;
}
}
return (UObject*)Asset;
}
void AMyNativePlayerController::IndexGameObjects() {
TArray<FString> controlArray;
TArray<FString> GameObjects_ClassNamesLocal;
TArray<FString> GameObjects_PathToBlueprintLocal;
TArray<FString> GameObjects_PathToLogoLocal;
UObjectLibrary * lib = UObjectLibrary::CreateLibrary(AMyFurnitureActor::StaticClass(), true, true);
lib->AddToRoot();
int32 loaded = lib->LoadBlueprintAssetDataFromPath("/Game/");
//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Cyan, FString::FromInt(loaded) + TEXT(" objects loaded for lib "));
TArray<FAssetData> Assets;
lib->GetAssetDataList(Assets);
for (int32 i = 0; i < Assets.Num(); ++i) {
FAssetData& assetData = Assets[i];
//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Get ship: check obj - ") + assetData.AssetName.ToString());
if (!MyGetAsset(assetData))
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Get ship: Failed to load object by GetAsset - ") + assetData.AssetName.ToString());
//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO Class Name - ") + assetData.GetClass()->GetName());
//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO FullName - ") + assetData.GetFullName());
//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO AssetClass - ") + assetData.AssetClass.ToString());
//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO ObjectPath - ") + assetData.ObjectPath.ToString());
//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO IsAssetLoaded - ") + (assetData.IsAssetLoaded() ? FString("YES") : FString("NO")));
//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO IsValid - ") + (assetData.IsValid() ? FString("YES") : FString("NO")));
FString assetDataObjectPath = assetData.ObjectPath.ToString();
if (assetDataObjectPath.Contains(TEXT("forBuildMode"))) {
if (!controlArray.Contains(assetDataObjectPath)) {
controlArray.Add(assetDataObjectPath);
auto cls = StaticLoadObject(UObject::StaticClass(), nullptr, *assetDataObjectPath);
//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("assetDataObjectPath ") + assetDataObjectPath);
if (!cls) {
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Failed to load UClass ") + assetDataObjectPath);
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("----------------------------- "));
}
FString p = assetDataObjectPath.Left(assetDataObjectPath.Find(TEXT("_Blueprint."), ESearchCase::CaseSensitive, ESearchDir::FromStart));
GameObjects_PathToBlueprintLocal.Add(p + "_Blueprint");
GameObjects_PathToLogoLocal.Add(p + "_logo");
int32 pos = p.Find(TEXT("/"), ESearchCase::IgnoreCase, ESearchDir::FromEnd) + 1;
pos = p.Len() - pos;
p = p.Right(pos);
p = p + "_Blueprint_C";
/*GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("pos= ") + FString::FromInt(pos));
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("p= ")+p);*/
GameObjects_ClassNamesLocal.Add(p);
}
}
}
// ----------------------------------------------------
UMyFurnitureSaveDB* SaveGameInstance = Cast<UMyFurnitureSaveDB>(UGameplayStatics::CreateSaveGameObject(UMyFurnitureSaveDB::StaticClass()));
SaveGameInstance->GameObjects_ClassNames = GameObjects_ClassNamesLocal;
SaveGameInstance->GameObjects_PathToBlueprint = GameObjects_PathToBlueprintLocal;
SaveGameInstance->GameObjects_PathToLogo = GameObjects_PathToLogoLocal;
UGameplayStatics::SaveGameToSlot(SaveGameInstance, SaveGameInstance->SaveSlotName, SaveGameInstance->UserIndex);
}
In this example will be selected items, which parented by AMyFurnitureActor BP.