In UE 5.3 and later, assigning a Sprite Atlas Group to a UPaperSprite asset can cause the editor to hang and eventually crash. This behavior has been reproduced in 5.3, 5.6, and a recent UE5-main source build at CL 48526824.
The issue is caused by an infinite loop between UPaperSprite::PostEditChangeProperty and the Paper2D atlas rebuild pipeline. When the AtlasGroup property is assigned in the editor, PostEditChangeProperty is invoked twice. The first invocation uses EPropertyChangeType::ValueSet (16) and corresponds to the user-driven property change. The second invocation occurs immediately afterward with EPropertyChangeType::Unspecified (1) and a null Property, as a result of atlas rebuild propagation through PostEditChange().
During this second invocation, the sprite interprets PropertyName == NAME_None as an indication that the atlas needs to be rebuilt again. This leads to another call to AtlasGroup->PostEditChange(), which re-enters the atlas generator and triggers an additional PostEditChange() on the sprite. This cycle repeats indefinitely, resulting in an infinite feedback loop between sprite and atlas rebuilds.
As a temporary workaround, the loop can be avoided by updating the conditional that guards the atlas rebuild logic in UPaperSprite::PostEditChangeProperty so that it skips rebuilds not only for EPropertyChangeType::Interactive, but also for EPropertyChangeType::Unspecified.
This behavior does not occur in 5.2 and appears to be a regression introduced in 5.3.
1. Open the attached repro project in UE 5.6 or newer.
2. Open the included sprite asset.
3. Under Sprite/Advanced select the Atlas Group property (currently None) and click on Create New Asset -> Sprite Atlas Group.
4. Save the new asset with any name.
Result: The editor hangs indefinitely and crashes later.
Infinite loop callstack in UE5-Main:
> UnrealEditor-Paper2D-Win64-Debug.dll!UPaperSprite::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 567 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaperAtlasGenerator::HandleAssetChangedEvent(UPaperSpriteAtlas * Atlas) Line 260 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaper2DEditor::OnPropertyChanged(UObject * ObjectBeingModified, FPropertyChangedEvent & PropertyChangedEvent) Line 291 C++
[External Code]
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 520 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2D-Win64-Debug.dll!UPaperSprite::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 589 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaperAtlasGenerator::HandleAssetChangedEvent(UPaperSpriteAtlas * Atlas) Line 260 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaper2DEditor::OnPropertyChanged(UObject * ObjectBeingModified, FPropertyChangedEvent & PropertyChangedEvent) Line 291 C++
[External Code]
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 520 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2D-Win64-Debug.dll!UPaperSprite::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 589 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaperAtlasGenerator::HandleAssetChangedEvent(UPaperSpriteAtlas * Atlas) Line 260 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaper2DEditor::OnPropertyChanged(UObject * ObjectBeingModified, FPropertyChangedEvent & PropertyChangedEvent) Line 291 C++
[External Code]
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 520 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2D-Win64-Debug.dll!UPaperSprite::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 589 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaperAtlasGenerator::HandleAssetChangedEvent(UPaperSpriteAtlas * Atlas) Line 260 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaper2DEditor::OnPropertyChanged(UObject * ObjectBeingModified, FPropertyChangedEvent & PropertyChangedEvent) Line 291 C++
[External Code]
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 520 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2D-Win64-Debug.dll!UPaperSprite::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 589 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaperAtlasGenerator::HandleAssetChangedEvent(UPaperSpriteAtlas * Atlas) Line 260 C++
UnrealEditor-Paper2DEditor-Win64-Debug.dll!FPaper2DEditor::OnPropertyChanged(UObject * ObjectBeingModified, FPropertyChangedEvent & PropertyChangedEvent) Line 291 C++
[External Code]
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 520 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChange() Line 514 C++
UnrealEditor-Paper2D-Win64-Debug.dll!UPaperSprite::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) Line 589 C++
UnrealEditor-CoreUObject-Win64-Debug.dll!UObject::PostEditChangeChainProperty(FPropertyChangedChainEvent & PropertyChangedEvent) Line 645 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!FPropertyNode::NotifyPostChange::__l14::<lambda_1>::operator()(UObject * Object) Line 3419 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!FPropertyNode::NotifyPostChange(FPropertyChangedEvent & InPropertyChangedEvent, FNotifyHook * InNotifyHook) Line 3424 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!FPropertyValueImpl::ImportText(const TArray<FObjectBaseAddress,TSizedDefaultAllocator<32>> & InObjects, const TArray<FString,TSizedDefaultAllocator<32>> & InValues, FPropertyNode * InPropertyNode, unsigned int Flags) Line 674 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!FPropertyValueImpl::ImportText(const FString & InValue, FPropertyNode * InPropertyNode, unsigned int Flags) Line 314 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!FPropertyValueImpl::SetValueAsString(const FString & InValue, unsigned int Flags) Line 1020 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!FPropertyHandleBase::SetValueFromFormattedString(const FString & InValue, unsigned int Flags) Line 2822 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!FPropertyHandleObject::SetValueFromFormattedString(const FString & InValue, unsigned int Flags, bool bSkipResolve) Line 4698 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!FPropertyHandleObject::SetValue(const FAssetData & NewValue, unsigned int Flags) Line 4411 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!SPropertyEditorAsset::SetValue(const FAssetData & AssetData) Line 1404 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!SPropertyEditorAsset::OnAssetSelected(const FAssetData & AssetData) Line 1592 C++
[External Code]
UnrealEditor-PropertyEditor-Win64-Debug.dll!SPropertyMenuAssetPicker::SetValue(const FAssetData & AssetData) Line 357 C++
UnrealEditor-PropertyEditor-Win64-Debug.dll!SPropertyMenuAssetPicker::OnCreateNewAssetSelected(TWeakObjectPtr<UFactory,FWeakObjectPtr> FactoryPtr) Line 399 C++
[External Code]
UnrealEditor-Slate-Win64-Debug.dll!SMenuEntryBlock::OnClicked(bool bCheckBoxClicked) Line 1193 C++
UnrealEditor-Slate-Win64-Debug.dll!SMenuEntryBlock::OnMenuItemButtonClicked() Line 1148 C++
[External Code]
UnrealEditor-Slate-Win64-Debug.dll!SButton::ExecuteOnClick() Line 574 C++
UnrealEditor-Slate-Win64-Debug.dll!SButton::OnMouseButtonUp(const FGeometry & MyGeometry, const FPointerEvent & MouseEvent) Line 442 C++
UnrealEditor-Slate-Win64-Debug.dll!SMenuEntryButton::OnMouseButtonUp(const FGeometry & MyGeometry, const FPointerEvent & MouseEvent) Line 444 C++
UnrealEditor-Slate-Win64-Debug.dll!FSlateApplication::RoutePointerUpEvent::__l8::<lambda_2>::operator()(const FArrangedWidget & TargetWidget, const FPointerEvent & Event) Line 5514 C++
UnrealEditor-Slate-Win64-Debug.dll!FEventRouter::Route<FReply,FEventRouter::FToLeafmostPolicy,FPointerEvent,`FSlateApplication::RoutePointerUpEvent'::`8'::<lambda_2>>(FSlateApplication * ThisApplication, FEventRouter::FToLeafmostPolicy RoutingPolicy, FPointerEvent EventCopy, const FSlateApplication::RoutePointerUpEvent::__l8::<lambda_2> & Lambda, ESlateDebuggingInputEvent DebuggingInputEvent) Line 461 C++
UnrealEditor-Slate-Win64-Debug.dll!FSlateApplication::RoutePointerUpEvent(const FWidgetPath & WidgetsUnderPointer, const FPointerEvent & PointerEvent) Line 5500 C++
UnrealEditor-Slate-Win64-Debug.dll!FSlateApplication::ProcessMouseButtonUpEvent(const FPointerEvent & MouseEvent) Line 6085 C++
UnrealEditor-Slate-Win64-Debug.dll!FSlateApplication::OnMouseUp(const EMouseButtons::Type Button, const UE::Math::TVector2<double> CursorPos) Line 6041 C++
UnrealEditor-ApplicationCore-Win64-Debug.dll!FWindowsApplication::ProcessDeferredMessage(const FDeferredWindowsMessage & DeferredMessage) Line 3423 C++
UnrealEditor-ApplicationCore-Win64-Debug.dll!FWindowsApplication::DeferMessage(TSharedPtr<FWindowsWindow,1> & NativeWindow, HWND__ * InHWnd, unsigned int InMessage, unsigned __int64 InWParam, __int64 InLParam, int MouseX, int MouseY, unsigned int RawInputFlags) Line 4120 C++
UnrealEditor-ApplicationCore-Win64-Debug.dll!FWindowsApplication::ProcessMessage(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 2325 C++
UnrealEditor-ApplicationCore-Win64-Debug.dll!WindowsApplication_WndProc(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 2142 C++
UnrealEditor-ApplicationCore-Win64-Debug.dll!FWindowsApplication::AppWndProc(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 2148 C++
[External Code]
UnrealEditor-ApplicationCore-Win64-Debug.dll!WinPumpMessages() Line 207 C++
UnrealEditor-ApplicationCore-Win64-Debug.dll!FWindowsPlatformApplicationMisc::PumpMessages(bool bFromMainLoop) Line 237 C++
UnrealEditor-Win64-Debug.exe!FEngineLoop::Tick() Line 5790 C++
UnrealEditor-Win64-Debug.exe!EngineTick() Line 60 C++
UnrealEditor-Win64-Debug.exe!GuardedMain(const wchar_t * CmdLine) Line 192 C++
UnrealEditor-Win64-Debug.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) Line 266 C++
UnrealEditor-Win64-Debug.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) Line 334 C++
[External Code]
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-358149 in the post.