void FCollectionAssetRegistryBridge::OnAssetRemoved(const FAssetData& AssetData) { FCollectionManagerModule& CollectionManagerModule = FCollectionManagerModule::GetModule(); if (AssetData.IsRedirector()) { // Notify the collections manager that a redirector has been removed // This will attempt to re-save any collections that still have a reference to this redirector in their on-disk collection data CollectionManagerModule.Get().HandleRedirectorDeleted(AssetData.ObjectPath); } else { // Notify the collections manager that an asset has been removed CollectionManagerModule.Get().HandleObjectDeleted(AssetData.ObjectPath); } }
virtual bool FixupObject(const FName& InObjectPath, FName& OutNewObjectPath) override { OutNewObjectPath = NAME_None; if (InObjectPath.ToString().StartsWith(TEXT("/Script/"))) { // We can't use FindObject while we're saving if (!GIsSavingPackage) { const FString ClassPathStr = InObjectPath.ToString(); UClass* FoundClass = FindObject<UClass>(ANY_PACKAGE, *ClassPathStr); if (!FoundClass) { // Use the linker to search for class name redirects (from the loaded ActiveClassRedirects) const FString ClassName = FPackageName::ObjectPathToObjectName(ClassPathStr); const FName NewClassName = FLinkerLoad::FindNewNameForClass(*ClassName, false); if (!NewClassName.IsNone()) { // Our new class name might be lacking the path, so try and find it so we can use the full path in the collection FoundClass = FindObject<UClass>(ANY_PACKAGE, *NewClassName.ToString()); if (FoundClass) { OutNewObjectPath = *FoundClass->GetPathName(); } } } } } else { // Keep track of visted redirectors in case we loop. TSet<FName> VisitedRedirectors; // Use the asset registry to avoid loading the object FAssetData ObjectAssetData = AssetRegistryModule.Get().GetAssetByObjectPath(InObjectPath); while (ObjectAssetData.IsValid() && ObjectAssetData.IsRedirector()) { // Check to see if we've already seen this path before, it's possible we might have found a redirector loop. if ( VisitedRedirectors.Contains(ObjectAssetData.ObjectPath) ) { UE_LOG(LogContentBrowser, Error, TEXT("Redirector Loop Found!")); for ( FName Redirector : VisitedRedirectors ) { UE_LOG(LogContentBrowser, Error, TEXT("Redirector: %s"), *Redirector.ToString()); } ObjectAssetData = FAssetData(); break; } VisitedRedirectors.Add(ObjectAssetData.ObjectPath); // Get the destination object from the meta-data rather than load the redirector object, as // loading a redirector will also load the object it points to, which could cause a large hitch FString DestinationObjectPath; if (ObjectAssetData.GetTagValue("DestinationObject", DestinationObjectPath)) { ConstructorHelpers::StripObjectClass(DestinationObjectPath); ObjectAssetData = AssetRegistryModule.Get().GetAssetByObjectPath(*DestinationObjectPath); } else { ObjectAssetData = FAssetData(); } } OutNewObjectPath = ObjectAssetData.ObjectPath; } return OutNewObjectPath != NAME_None && InObjectPath != OutNewObjectPath; }