Dynamic blueprints loading

Function which works in standalone, PIE and shipped game.

bool UMyBlueprintFunctionLibrary::ListAllBlueprintsInPath(FName Path, TArray<UClass*>& Result, UClass* Class)
{	
	auto Library = UObjectLibrary::CreateLibrary(Class, true, GIsEditor);
	Library->LoadBlueprintAssetDataFromPath(Path.ToString());

	TArray<FAssetData> Assets;
	Library->GetAssetDataList(Assets);

	for (auto& Asset : Assets)
	{		
		UBlueprint* bp = Cast<UBlueprint>(Asset.GetAsset());
		if (bp)
		{
			auto gc = bp->GeneratedClass;
			if (gc) 
			{
				Result.Add(gc);
			}
		}
		else 
		{			
			auto GeneratedClassName = (Asset.AssetName.ToString() + "_C");			

			UClass* Clazz = FindObject<UClass>(Asset.GetPackage(), *GeneratedClassName);
			if (Clazz)
			{				
				Result.Add(Clazz);
			} 
			else
			{
				UObjectRedirector* RenamedClassRedirector = FindObject<UObjectRedirector>(Asset.GetPackage(), *GeneratedClassName);
				if (RenamedClassRedirector)
				{
					Result.Add(CastChecked<UClass>(RenamedClassRedirector->DestinationObject));
				}
			}			
			
		}
	}

	return true;
}

2 Likes