Here is some code snippet from my pickup spawner which spawns a random Blueprint out of a given folder path inside the editor of the class “ASomPickup”. Hope it helps.
FString PickupSubPath = "None";
int32 ChosenArrayIndex = -1;
//Get Type of pickup
while (PickupSubPath == "None")
{
//new randoms
TempRandFloat = FMath::FRand();
TempRandInt = FMath::RandRange(0, Probability_Array.Num() - 1);
if (TempRandFloat <= Probability_Array[TempRandInt])
ChosenArrayIndex = TempRandInt;
if (ChosenArrayIndex > -1)
{
if (ChosenArrayIndex == 0)
PickupSubPath = "Gear";
if (ChosenArrayIndex == 1)
PickupSubPath = "Food";
if (ChosenArrayIndex == 2)
PickupSubPath = "Drink";
if (ChosenArrayIndex == 3)
PickupSubPath = "Spellbook";
if (ChosenArrayIndex == 4)
PickupSubPath = "Weapon";
if (ChosenArrayIndex == 5)
PickupSubPath = "Misc";
}
}
//Create object library
TArray<FAssetData> AssetDatas;
TArray<FAssetData> RelevantAssetDatas;
FAssetData ChosenAssetData;
UObjectLibrary* ObjLib = UObjectLibrary::CreateLibrary(ASomPickup::StaticClass(), true, GIsEditor);
//Load data of the "pickup" classes into the object library
ObjLib->AddToRoot();
ObjLib->LoadBlueprintAssetDataFromPath(TEXT("/Game/Pickups/" + PickupSubPath));
ObjLib->GetAssetDataList(AssetDatas);
if (AssetDatas.Num() > 0)
{
if (AssetDatas.Num() == 1)
{
//Get the only Asset in this folder
ChosenAssetData = AssetDatas[0];
}
else
{
while (RelevantAssetDatas.Num() <= 0)
{
//new random float
TempRandFloat = FMath::FRand();
//Find relevant Assets (in terms of spawn probability)
for (int32 iList = 0; iList < AssetDatas.Num(); iList++)
{
FAssetData& AssetData = AssetDatas[iList];
const FString* FoundTypeNameString = AssetData.TagsAndValues.Find(GET_MEMBER_NAME_CHECKED(ASomPickup, SpawnProbability));
if (FoundTypeNameString && TempRandFloat < FCString::Atof(**FoundTypeNameString))
{
RelevantAssetDatas.Add(AssetData);
}
}
}
//new random int
TempRandInt = FMath::RandRange(0, RelevantAssetDatas.Num() - 1);
//Choose random asset from suitable ones
ChosenAssetData = RelevantAssetDatas[TempRandInt];
}
//Load class from chosen (unloaded) asset/class
FString LoadClassString = ChosenAssetData.ToStringReference().ToString() + "_C";
ChosenSpawnItemClass = LoadClass<ASomPickup>(NULL, *LoadClassString, NULL, LOAD_None, NULL);
}
//SPAWN ITEM
if (ChosenSpawnItemClass != nullptr)
{
FActorSpawnParameters SpawnInfo;
ASomPickup* SpawnedActor = GetWorld()->SpawnActor<ASomPickup>(ChosenSpawnItemClass, SpawnInfo);
SpawnedActor->SetActorLocation(this->GetActorLocation());
}