Uses the Asset Registry to determine whether a SoftClass is a child of another class, without loading it. NOTE: This snippet has limited utility, traversing the asset registry may be slower than just loading the class in some cases!
void UMyAssetManager::SetAssetRegistryTempCachingEnabled(const bool bEnabled) { IAssetRegistry::Get()->SetTemporaryCachingMode(bEnabled); } bool UMyAssetManager::SoftClassIsChildOf(const TSoftClassPtr<UObject>& SoftClass, const TSubclassOf<UObject>& Class) { if (SoftClass.IsNull() || Class == nullptr) { // Class is invalid, do nothing return false; } else if (const UClass* LoadedClass = SoftClass.Get()) { // Class is already loaded, use the fast path return LoadedClass->IsChildOf(Class); } else { // Use Asset Registry for Unloaded Classes // Caution: This may be slow if TempCaching is disabled. FAssetData AssetData; if (UAssetManager::Get().GetAssetDataForPath(SoftClass.ToSoftObjectPath(), AssetData)) { if (AssetData.AssetClass == Class->GetFName()) { return true; } else { // Unfortunately the temp class hierarchy data is private, so we can't walk it manually. TArray<FName> AncestorClasses; IAssetRegistry::Get()->GetAncestorClassNames(AssetData.AssetClass, AncestorClasses); return AncestorClasses.Contains(Class->GetFName()); } } return false; } }