Description

When a blueprint's component hierarchy is changed by changing a child component's mobility value to Static while deleting its parent component which has Movable mobility, levels saved with an outdated version of the actor will print a one-time load warning when loading and fixing up the old actor, while will keep occurring on load until the level is resaved. This can affect productivity when either cook or validation tasks treat warnings as errors, as the warning is unnecessary and since in this scenario the actor is properly fixed up by rerunning construction script.

The task is to evaluate and prevent this warning, when it's unnecessary and irrelevant. In this case I believe it's irrelevant because (see repro steps for component naming):

  • At the moment of serialization, SceneComponentC was movable and attached to movable SceneComponentB
  • In the new actor setup, SceneComponentC is static and attached to static SceneComponentA

The printed warning is irrelevant for both the previous actor class and the new actor class, so preferably we can avoid printing it or avoid the steps that trigger it.

Not a blocker, but would be nice to fix to support teams that prefer warnings as errors.

Steps to Reproduce

Create an actor blueprint with the following component hierarchy and mobility:

  • SceneComponentA (Static)
    • SceneComponentB (Movable)
      • SceneComponentC (Movable)

Create a level, place that actor, save the level.

  1. Restart the editor, make sure the level is not loaded.
  2. Open the actor blueprint, and make the following changes:
    • Delete SceneComponentB, C will be auto-promoted
    • Give SceneComponentC static mobility. The hierarchy is now SceneComponentA (Static) -> SceneComponentC (Static)
    • Compile the blueprint
    • No need to resave (avoid resaving for ease of repro)

3. Load the level, notice the log will print this warning:

 

PIE: Warning: AttachTo: '/Game/ActorLevel_P.ActorLevel_P:PersistentLevel.Actor_BP_C_5.SceneComponentB' is not static  (in blueprint "Actor_BP"), cannot attach '/Game/ActorLevel_P.ActorLevel_P:PersistentLevel.Actor_BP_C_5.SceneComponentC' which is static to it. Aborting.
 

You can reload the level via context browser to retrigger it as long as you don't resave either asset.
Expected: No warning

 

Callstack

>    UnrealEditor-Engine.dll!USceneComponent::AttachToComponent(USceneComponent * Parent, const FAttachmentTransformRules & AttachmentRules, FName SocketName) Line 2000    C++
     UnrealEditor-Engine.dll!USceneComponent::OnRegister() Line 679    C++
     UnrealEditor-Engine.dll!UActorComponent::ExecuteRegisterEvents(FRegisterComponentContext * Context) Line 1674    C++
     UnrealEditor-Engine.dll!UActorComponent::RegisterComponentWithWorld(UWorld * InWorld, FRegisterComponentContext * Context) Line 1346    C++
     UnrealEditor-Engine.dll!AActor::IncrementalRegisterComponents(int NumComponentsToRegister, FRegisterComponentContext * Context) Line 5453    C++
     [Inline Frame] UnrealEditor-Engine.dll!ULevel::IncrementalRegisterComponents(bool) Line 1698    C++
     UnrealEditor-Engine.dll!ULevel::IncrementalUpdateComponents(int NumComponentsToUpdate, bool bRerunConstructionScripts, FRegisterComponentContext * Context) Line 1633    C++
     UnrealEditor-Engine.dll!UWorld::UpdateWorldComponents(bool bRerunConstructionScripts, bool bCurrentLevelOnly, FRegisterComponentContext * Context) Line 2611    C++
     UnrealEditor-UnrealEd.dll!UEditorEngine::InitializeNewlyCreatedInactiveWorld(UWorld * World) Line 7460    C++
     UnrealEditor-UnrealEd.dll!UEditorEngine::OnAssetLoaded(UObject * Asset) Line 7408    C++
     [Inline Frame] UnrealEditor-UnrealEd.dll!Invoke(void(UEditorEngine::*)(UObject *)) Line 66    C++
     [Inline Frame] UnrealEditor-UnrealEd.dll!UE::Core::Private::Tuple::TTupleBase<TIntegerSequence<unsigned int>>::ApplyAfter(void(UEditorEngine::*)(UObject *) &) Line 311    C++
     UnrealEditor-UnrealEd.dll!TBaseUObjectMethodDelegateInstance<0,UEditorEngine,void __cdecl(UObject *),FDefaultDelegateUserPolicy>::ExecuteIfSafe(UObject * <Params_0>) Line 667    C++
     [Inline Frame] UnrealEditor-CoreUObject.dll!TMulticastDelegateBase<FDefaultDelegateUserPolicy>::Broadcast(UObject *) Line 254    C++
     [Inline Frame] UnrealEditor-CoreUObject.dll!TMulticastDelegate<void __cdecl(UObject *),FDefaultDelegateUserPolicy>::Broadcast(UObject *) Line 956    C++
     UnrealEditor-CoreUObject.dll!EndLoad(FUObjectSerializeContext * LoadContext, TArray<UPackage *,TSizedDefaultAllocator<32>> * OutLoadedPackages) Line 2347    C++
     UnrealEditor-CoreUObject.dll!LoadPackageInternal::__l102::<lambda_2>::operator()() Line 1751    C++
     UnrealEditor-CoreUObject.dll!LoadPackageInternal(UPackage * InOuter, const FPackagePath & PackagePath, unsigned int LoadFlags, FLinkerLoad * ImportLinker, FArchive * InReaderOverride, const FLinkerInstancingContext * InstancingContext, const FPackagePath * DiffPackagePath) Line 1853    C++
     UnrealEditor-CoreUObject.dll!LoadPackage(UPackage * InOuter, const FPackagePath & PackagePath, unsigned int LoadFlags, FArchive * InReaderOverride, const FLinkerInstancingContext * InstancingContext, const FPackagePath * DiffPackagePath) Line 2014    C++
     UnrealEditor-CoreUObject.dll!LoadPackage(UPackage * InOuter, const wchar_t * InLongPackageNameOrFilename, unsigned int LoadFlags, FArchive * InReaderOverride, const FLinkerInstancingContext * InstancingContext) Line 1987    C++
     UnrealEditor-CoreUObject.dll!PackageReloadInternal::LoadReplacementPackage(UPackage * InExistingPackage, const unsigned int InLoadFlags) Line 458    C++
     UnrealEditor-CoreUObject.dll!ReloadPackages(const TArrayView<FReloadPackageData,int> & InPackagesToReload, TArray<UPackage *,TSizedDefaultAllocator<32>> & OutReloadedPackages, const int InNumPackagesPerBatch) Line 684    C++
     UnrealEditor-UnrealEd.dll!UPackageTools::ReloadPackages(const TArray<UPackage *,TSizedDefaultAllocator<32>> & TopLevelPackages, FText & OutErrorMessage, const EReloadPackagesInteractionMode InteractionMode) Line 930    C++
     UnrealEditor-UnrealEd.dll!UPackageTools::ReloadPackages(const TArray<UPackage *,TSizedDefaultAllocator<32>> & TopLevelPackages) Line 630    C++
     UnrealEditor-ContentBrowserAssetDataSource.dll!FAssetFileContextMenu::ExecuteReload() Line 1676    C++
     [Inline Frame] UnrealEditor-ContentBrowserAssetDataSource.dll!Invoke(void(FAssetFileContextMenu::*)()) Line 66    C++
     [Inline Frame] UnrealEditor-ContentBrowserAssetDataSource.dll!UE::Core::Private::Tuple::TTupleBase<TIntegerSequence<unsigned int>>::ApplyAfter(void(FAssetFileContextMenu::*)() &) Line 311    C++
     UnrealEditor-ContentBrowserAssetDataSource.dll!TBaseSPMethodDelegateInstance<0,FAssetFileContextMenu,1,void __cdecl(void),FDefaultDelegateUserPolicy>::ExecuteIfSafe() Line 298    C++
     UnrealEditor-Slate.dll!TDelegate<void __cdecl(void),FDefaultDelegateUserPolicy>::ExecuteIfBound<void,0>() Line 570    C++
     [Inline Frame] UnrealEditor-Slate.dll!FUIAction::Execute() Line 139    C++
     UnrealEditor-Slate.dll!SMenuEntryBlock::OnClicked(bool bCheckBoxClicked) Line 1167    C++
     UnrealEditor-Slate.dll!SMenuEntryBlock::OnMenuItemButtonClicked() Line 1118    C++
     [Inline Frame] UnrealEditor-Slate.dll!Invoke(FReply(SMenuEntryBlock::*)()) Line 66    C++
     [Inline Frame] UnrealEditor-Slate.dll!UE::Core::Private::Tuple::TTupleBase<TIntegerSequence<unsigned int>>::ApplyAfter(FReply(SMenuEntryBlock::*)() &) Line 311    C++
     UnrealEditor-Slate.dll!TBaseSPMethodDelegateInstance<0,SMenuEntryBlock,1,FReply __cdecl(void),FDefaultDelegateUserPolicy>::Execute() Line 281    C++
     UnrealEditor-Slate.dll!TDelegate<FReply __cdecl(void),FDefaultDelegateUserPolicy>::Execute() Line 549    C++
     UnrealEditor-Slate.dll!SButton::ExecuteOnClick() Line 465    C++
     UnrealEditor-Slate.dll!SButton::OnMouseButtonUp(const FGeometry & MyGeometry, const FPointerEvent & MouseEvent) Line 390    C++
     UnrealEditor-Slate.dll!SMenuEntryButton::OnMouseButtonUp(const FGeometry & MyGeometry, const FPointerEvent & MouseEvent) Line 434    C++
     [Inline Frame] UnrealEditor-Slate.dll!FSlateApplication::RoutePointerUpEvent::__l8::<lambda_3>::operator()(const FArrangedWidget &) Line 5220    C++
     UnrealEditor-Slate.dll!FEventRouter::Route<FReply,FEventRouter::FToLeafmostPolicy,FPointerEvent,`FSlateApplication::RoutePointerUpEvent'::`8'::<lambda_3>>(FSlateApplication * ThisApplication, FEventRouter::FToLeafmostPolicy RoutingPolicy, FPointerEvent EventCopy, const FSlateApplication::RoutePointerUpEvent::__l8::<lambda_3> & Lambda, ESlateDebuggingInputEvent DebuggingInputEvent) Line 442    C++
     UnrealEditor-Slate.dll!FSlateApplication::RoutePointerUpEvent(const FWidgetPath & WidgetsUnderPointer, const FPointerEvent & PointerEvent) Line 5206    C++
     UnrealEditor-Slate.dll!FSlateApplication::ProcessMouseButtonUpEvent(const FPointerEvent & MouseEvent) Line 5775    C++
     UnrealEditor-Slate.dll!FSlateApplication::OnMouseUp(const EMouseButtons::Type Button, const UE::Math::TVector2<double> CursorPos) Line 5740    C++
     UnrealEditor-ApplicationCore.dll!FWindowsApplication::ProcessDeferredMessage(const FDeferredWindowsMessage & DeferredMessage) Line 2231    C++
     UnrealEditor-ApplicationCore.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 2738    C++
     UnrealEditor-ApplicationCore.dll!FWindowsApplication::ProcessMessage(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 1099    C++
     [Inline Frame] UnrealEditor-ApplicationCore.dll!WindowsApplication_WndProc(HWND__ *) Line 931    C++
     UnrealEditor-ApplicationCore.dll!FWindowsApplication::AppWndProc(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 937    C++
     user32.dll!00007ffd113e8961()    Unknown
     user32.dll!00007ffd113e8421()    Unknown
     [Inline Frame] UnrealEditor-ApplicationCore.dll!WinPumpMessages() Line 119    C++
     UnrealEditor-ApplicationCore.dll!FWindowsPlatformApplicationMisc::PumpMessages(bool bFromMainLoop) Line 148    C++
     UnrealEditor.exe!FEngineLoop::Tick() Line 5749    C++
     [Inline Frame] UnrealEditor.exe!EngineTick() Line 61    C++
     UnrealEditor.exe!GuardedMain(const wchar_t * CmdLine) Line 188    C++
     UnrealEditor.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) Line 247    C++
     UnrealEditor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) Line 298    C++
     [Inline Frame] UnrealEditor.exe!invoke_main() Line 102    C++
     UnrealEditor.exe!__scrt_common_main_seh() Line 288    C++
     kernel32.dll!00007ffd11ba257d()    Unknown
     ntdll.dll!00007ffd1320aa48()    Unknown

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-212059 in the post.

0
Login to Vote

Backlogged
ComponentUE - Gameplay - Blueprint
Affects Versions5.3
CreatedApr 11, 2024
UpdatedApr 12, 2024