Description

Summary

In a non-World-Partition map with streamed sublevels, PCG Editor Mode interactive tools (Draw Spline / SpacingTool, Area, Paint, Volume, ...) spawn their new tool actor in the PersistentLevel instead of the current level (World->GetCurrentLevel()). This only happens when no compatible actor is selected when the tool is activated. Standard editor actor placement uses the current level (EditorActorSubsystem.cpp, ULevel* DesiredLevel = World->GetCurrentLevel();).

Reported by a licensee (EPS / SF case 27094155).

Expected

The tool actor is created in the current level (e.g. SubLevel_01).

Actual

The tool actor (e.g. "PCG Area Tool Actor") is created in the PersistentLevel and stays there after Accept.

Root cause

  1. UPCGInteractiveToolSettings::InitActorAndComponent (PCGInteractiveToolSettings.cpp) reuses a selected compatible actor if there is one; otherwise it calls UE::PCG::EditorMode::Actor::SpawnWorking(World, ...). Every PCG Mode tool goes through this path.
  2. Actor::Spawn / Actor::SpawnWorking (PCGEdModeActorHelpers.cpp) don't set FActorSpawnParameters::OverrideLevel. In Main (after [Link Removed]) SpawnWorking also hard-codes ULevel* Level = World->PersistentLevel; for the unique name and the external-actor decision.
  3. UPCGActorHelpers::SpawnDefaultActor(const FSpawnDefaultActorParams&) (PCGActorHelpers.cpp) falls back to SpawnParams.OverrideLevel = Params.World->PersistentLevel; when no override is given (since CL 33654117), so UWorld::SpawnActor never reaches its own CurrentLevel default.
  4. On Apply, the actor only has RF_Transient cleared and is never moved.

Not a regression. [Link Removed] touches the same function (WP external packaging) but does not change the level.

Proposed fix

In PCGEdModeActorHelpers.cpp, add a GetSpawnLevel(World) helper returning World->GetCurrentLevel() (falling back to PersistentLevel), set SpawnParams.OverrideLevel from it in Spawn and SpawnWorking, and use it for the existing ULevel* Level in SpawnWorking so name, external packaging and level stay consistent. SpawnDefaultActor's fallback is left alone because it's shared with runtime/generation spawning. In WP maps the current level is the persistent level, so behaviour there is unchanged. Fix verified locally on 5.8.3.

Workarounds

  • Select a compatible actor that already lives in the target sublevel before activating the tool.
  • After Accept, use Levels > Move Selected Actors to Level, then regenerate.
Steps to Reproduce
  1. Create a new non-World-Partition level (Basic).
  2. Levels window > Add Level (Create New or Add Existing) to add a streamed sublevel.
  3. Make the sublevel current.
  4. Press Esc so nothing is selected.
  5. Enter PCG Mode (Shift+9) > Draw Spline (SpacingTool), click a few points, then Accept.
  6. Check the new tool actor's level in the Outliner.

Expected: actor is in the current sublevel. Actual: actor is in the PersistentLevel.

Have Comments or More Details?

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

0
Login to Vote

Unresolved
CreatedOct 21, 2026
UpdatedOct 21, 2026
View Jira Issue