This is a regression, it worked correctly up to UE 5.4, but repros on UE 5.5 and 5.6. Also, this seems related to [Link Removed], which was fixed by CL 40649716/40649749 and integrated into UE 5.6, but this was not fixed along with it.
When an actor is moved from a non-current level to the current level, the outliner displays its label incorrectly as a generic name derived from its classname, until the next time the tab is refreshed.
From a preliminary investigation, this bug seems to be related to the following: moving an actor from one level to another involves cutting it from the original level and pasting it on the destination one. The cut operation ends up calling SSceneOutliner::OnHierarchyChangedEvent(), which emplaces a new "Removed" entry on the PendingOperations array. The paste operation ends up calling ULevelFactory::FactoryCreateText(), then UWorld::SpawnActor(), then SSceneOutliner::OnHierarchyChangedEvent(), which emplaces a new "Added" entry on the PendingOperations array. At this time, however, the newly spawned actor has not got the correct label yet. The label is fixed on the actor by a call to ImportObjectProperties() further down function ULevelFactory::FactoryCreateText(), but the "Item" that was requested to be added to the outliner never gets its "DisplayString" fixed (the operation on "PendingOperations" has the wrong DisplayString, and the "NewItemActions" array does not contain a "Rename" action). The SceneOutliner does get Refresh() called some times during this process, but the refresh is later done based on outdated information.
Note: When the move operation targets a non-current level, that level is made current as part of the operation. This change of current level triggers SSceneOutliner::FullRefresh(), which remains deferred until the next tick, after the move operation is completed. So, the first outliner tick does that full refresh, which rebuilds the entire actor list with up-to-date information.
1. Create a new level "MyLevel" from the "Basic" template
2. Create a new empty level "MySubLevel"
3. Open "MyLevel", and in the "Levels" tab, add "MySubLevel" as a sublevel
4. In the "Levels" tab, double-click "Persistent Level" to make it current
5. Place a new shape actor on the persistent level for "MyLevel"
6. Rename the shape actor to something descriptive (e.g. "MyCube", "MyCone" etc)
7. In the "Levels" tab, double-click "MySubLevel" to make it current
8. Select the shape actor and move it to "MySubLevel" using one of the following methods:
8.A. Press CTRL+M on the keyboard
8.B. On the "Actor" menu, select "Level – Move Selection to Current Level"
8.C. On the "Levels" tab, right-click "MySubLevel" and select "Move Selected Actors to Level"
9. Note that the moved actor has lost its label
10. Click anywhere on the Scene Outliner to make sure it has focus, and press F5 to refresh it.
11. Note that the moved actor has regained its label
12. Repeat the test, but use the "Levels" tab to move the actor to a non-current level.
12.1. Note that the moved actor does not lose its label in this case.
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-303041 in the post.
0 |
Component | UE - Editor - Workflow Systems |
---|---|
Affects Versions | 5.5, 5.6 |
Created | Jul 14, 2025 |
---|---|
Updated | Jul 18, 2025 |