I’m trying to get a list of blueprints in a given content folder, and from there to get several properties to populate another asset; but I’m having difficulty obtaining GetDefaultObject()
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(FName("AssetRegistry"));
IAssetRegistry& AssetRegistry = AssetRegistryModule.Get();
TArray<FAssetData> AssetsList;
AssetRegistry.GetAssetsByPath(FName("/Game/Objects/Props/Weapons/"), AssetsList, true);
for (int32 i = 0; i < AssetsList.Num(); i++)
{
if (AssetsList*.AssetClass == FName("Blueprint"))
{
UE_LOG(LogTemp, Warning, TEXT("Found asset of type: %s"), *AssetsList*.AssetClass.ToString());
TSubclassOf<AWeapon> Weapon = AssetsList*.GetAsset()->GetClass(); // always NULL
if (Weapon != nullptr)
{
UE_LOG(LogTemp, Warning, TEXT("Found asset: %s"), *Weapon->GetDefaultObject<AWeapon>()->DisplayName); // we don't get this far
}
}
}
GetAsset() returns UObject, and it’s GetClass() returns UBlueprint.
All blueprints in given folder are subclasses of AWeapon actors. How do dereference correctly to TSubclassOf<AWeapon>?
Assignement of UClass* to TSubclassOf<> usually works when I’m dealing with correct blueprints and their parents.
Any help/comment/ideas/suggestions are greatly appreciated!
Sounds like the problem is that “AssetsList*.GetAsset()->GetClass()” returns “UBlueprint::StaticClass()” which of course is NOT a subclass of AWeapon.
Try something like this instead
The asset is a Blueprint so its GetClass returns the same as UBlueprint::StaticClass().
The actual class generated by/for the Blueprint is accessible via TheBlueprint->GetBlueprintClass(). I’m not entirely certain this is always the case, but the UClass returned here might even be a UBlueprintGeneratedClass (derived from UClass).
Edit: actually that won’t work. I just checked UBlueprint::GetBlueprintClass and it just returns UBlueprintGeneratedClass::StaticClass() not the actual generated class that you’re looking for. There must be a way to access it although I cannot find it right now.
Edit2: aha found it, UBlueprint is derived from UBlueprintCore which has the following public member:
/** Pointer to the 'most recent' fully generated class */
UPROPERTY(nontransactional)
TSubclassOf<class UObject> GeneratedClass;