获取指定目录的所有蓝图文件的UBlueprintGeneratedClass
TArray<UClass*> UFileBFLibrary::getAllClassFromFolder(FString* path)
{
FString folderpath(*path);
UObjectLibrary* lib = UObjectLibrary::CreateLibrary(UObject::StaticClass(), false, GIsEditor);
lib->AddToRoot();
lib->LoadAssetDataFromPath(folderpath);
lib->LoadAssetsFromAssetData();
TArray<FAssetData> asset_data;
lib->GetAssetDataList(asset_data);
TArray<UClass*> result;
for (int32 i = 0; i < asset_data.Num(); i++)
{
FString filepath(asset_data[i].GetExportTextName());
FStringAssetReference asset_stream_ref(filepath);
TAssetPtr<UBlueprint> asset(asset_stream_ref);
UBlueprint* bp = asset.LoadSynchronous();
if(bp)
{
result.Add(bp->GeneratedClass);
}
}
return result;
}
通过蓝图文件路径创建物体
void ABaseActor::spawnActorByPath(const TCHAR* path, FVector vector, FRotator rotator)
{
UObject* SpawnActor = Cast<UObject>(StaticLoadObject(UObject::StaticClass(), NULL, path));
UBlueprint* GeneratedBP = Cast<UBlueprint>(SpawnActor);
if (!SpawnActor)
{
GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Red, FString::Printf(TEXT("CANT FIND OBJECT TO SPAWN")));
return;
}
UClass* SpawnClass = SpawnActor->StaticClass();
if (SpawnClass == NULL)
{
GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Red, FString::Printf(TEXT("CLASS == NULL")));
return;
}
UWorld* World = GetWorld();
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this;
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
World->SpawnActor<AActor>(GeneratedBP->GeneratedClass, vector, rotator, SpawnParams);
}
动态加载文件的两种方法
* 使用StaticLoadClass
UObject* SpawnActor = Cast<UObject>(StaticLoadObject(UObject::StaticClass(), NULL, path));
UBlueprint* GeneratedBP = Cast<UBlueprint>(SpawnActor);
* 使用 FStringAssetReference
FString filepath("Blueprint'/Game/RoomPart/BaseMoveActor_Child4.BaseMoveActor_Child4'");
FStringAssetReference asset_stream_ref(filepath);
TAssetPtr<UBlueprint> asset(asset_stream_ref);
UBlueprint* bp = asset.LoadSynchronous();