对象复用导致属性数据残留问题

<br/>

数据层A中有一个对象B

数据层A 加载的时候,B BeginPlay 之后 修改B的属性

卸载数据层A,B EndPlay

没有GC的时候,再次加载数据层A,这时候B的属性会出现残留

<br/>

UWorldPartitionLevelStreamingDynamic::RequestLevel

中 看起来通过package找到world直接用了

// Try to find the package to load

UPackage* LevelPackage = (UPackage*)StaticFindObjectFast(UPackage::StaticClass(), nullptr, WorldAssetPackageFName, /*bExactClass =*/ false, RF_NoFlags, EInternalObjectFlags::Garbage);

UWorld* FoundWorld = LevelPackage ? UWorld::FindWorldInPackage(LevelPackage) : nullptr;

<br/>

请问有没有好的解决方案

[Attachment Removed]

您好,这个是引擎的Reuse优化(LevelStreaming.ShouldReuseUnloadedButStillAroundLevels)

在开启Reuse(默认开启)的前提下,B 是被原样复用的同一个 UObject,因此"BeginPlay 时状态是干净这个假设在当前情况不成立

最简单的方案是在 EndPlay(EEndPlayReason::RemovedFromWorld) 里把B的这些属性重置回默认

[Attachment Removed]