Faild to Replace SoftObjectPtr/SoftObjectPath References

我自己尝试修改了一下,表面上可以解决问题,但是不确定这样是不是正确的改法:

1.ObjectTools.cpp 3326行,在RecursiveRetrieveReferencers(InObjectsToDelete, ReferencingObjects);后面

`// Preload referencer assets before final replace referencing.
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked(TEXT(“AssetRegistry”));
TArray DiskReferences;
for(UObject* ObjectToDelete : InObjectsToDelete)
{
AssetRegistryModule.Get().GetReferencers(ObjectToDelete->GetOutermost()->GetFName(), DiskReferences);
}

TArray DiskReferenceAssetDatas;
for (auto& ReferencePackageName : DiskReferences)
{
AssetRegistryModule.Get().GetAssetsByPackageName(ReferencePackageName,DiskReferenceAssetDatas);
}

for (auto& AssetData : DiskReferenceAssetDatas)
{
ReferencingObjects.Add(AssetData.GetAsset());
}`2.ArchiveReplaceObjectRef.h的函数operator<<(FSoftObjectPath& Value)后添加

virtual FArchive& operator<<(FSoftObjectPtr& Value) override { if (UObject* Obj = Value.ToSoftObjectPath().ResolveObject()) { *this << Obj; Value = Obj; } else { FArchiveReplaceObjectRefBase::operator<<(Value); } return *this; }3.FindReferencersArchive.h最后添加两函数声明

COREUOBJECT_API virtual FArchive& operator<<(struct FSoftObjectPath& Value) override; COREUOBJECT_API virtual FArchive& operator<<(FSoftObjectPtr& Value) override ;4.FindReferencersArchive.cpp最后添加两函数定义

`FArchive& FFindReferencersArchive::operator<<(struct FSoftObjectPath& Value)
{
if (!Value.IsValid())
return *this;

if (IsObjectReferenceCollector())
{
FString AssetName = Value.GetAssetPathString();
FString ReferencerName = PotentialReferencer->GetPathName();
if (Value.IsValid() && AssetName != ReferencerName)
{
UObject* Obj = Value.ResolveObject();
int32* pReferenceCount = TargetObjects.GetRefCountPtr(Obj);
if ( pReferenceCount != nullptr )
{
// if this object was serialized via a FProperty, add it to the list
if (GetSerializedProperty() != nullptr)
{
ReferenceMap.AddUnique(Obj, GetSerializedProperty());
}

// now increment the reference count for this target object
(*pReferenceCount)++;
}
}
}

return *this;
}

FArchive& FFindReferencersArchive::operator<<(FSoftObjectPtr& Value)
{
if (!Value.IsValid())
return *this;

if (IsObjectReferenceCollector())
{
FString AssetName = Value.ToSoftObjectPath().GetAssetPathString();
FString ReferencerName = PotentialReferencer->GetPathName();
if (Value.IsValid() && AssetName != ReferencerName)
{
UObject* Obj = Value.ToSoftObjectPath().ResolveObject();
int32* pReferenceCount = TargetObjects.GetRefCountPtr(Obj);
if ( pReferenceCount != nullptr )
{
// if this object was serialized via a FProperty, add it to the list
if (GetSerializedProperty() != nullptr)
{
ReferenceMap.AddUnique(Obj, GetSerializedProperty());
}

// now increment the reference count for this target object
(*pReferenceCount)++;
}
}
}

return *this;
}`