diff --git a/Unreal/Plugins/PS_Editor/Source/PS_Editor/GameMode/PS_Editor_PlayerController.cpp b/Unreal/Plugins/PS_Editor/Source/PS_Editor/GameMode/PS_Editor_PlayerController.cpp index 49fe2bf..eecfc7d 100644 --- a/Unreal/Plugins/PS_Editor/Source/PS_Editor/GameMode/PS_Editor_PlayerController.cpp +++ b/Unreal/Plugins/PS_Editor/Source/PS_Editor/GameMode/PS_Editor_PlayerController.cpp @@ -32,10 +32,15 @@ void APS_Editor_PlayerController::BeginPlay() UndoManager = NewObject(this); - // Create spawn manager and load catalogs from MasterCatalog + // Create spawn manager, scene serializer SpawnManager = NewObject(this); SpawnManager->Initialize(this); + SceneSerializer = NewObject(this); + SceneSerializer->SetSelectionManager(SelectionManager); + + // Load catalogs from MasterCatalog + if (UPS_Editor_MasterCatalog* Master = MasterCatalogAsset.LoadSynchronous()) { for (const TSoftObjectPtr& CatalogRef : Master->Catalogs) @@ -53,10 +58,16 @@ void APS_Editor_PlayerController::BeginPlay() { if (!Sub->PendingBaseLevel.IsEmpty()) { + UE_LOG(LogTemp, Log, TEXT("PS_Editor: Restoring from subsystem - BaseLevel='%s', Scenario='%s'"), + *Sub->PendingBaseLevel, *Sub->PendingScenarioName); + LoadBaseLevelAsSublevel(Sub->PendingBaseLevel); - if (!Sub->PendingScenarioName.IsEmpty() && SpawnManager) + + if (!Sub->PendingScenarioName.IsEmpty() && SpawnManager && SceneSerializer) { - SceneSerializer->LoadScene(Sub->PendingScenarioName, SpawnManager); + bool bLoaded = SceneSerializer->LoadScene(Sub->PendingScenarioName, SpawnManager); + UE_LOG(LogTemp, Log, TEXT("PS_Editor: LoadScene('%s') = %s"), + *Sub->PendingScenarioName, bLoaded ? TEXT("OK") : TEXT("FAILED")); } Sub->PendingScenarioName.Empty(); Sub->PendingBaseLevel.Empty(); @@ -72,9 +83,6 @@ void APS_Editor_PlayerController::BeginPlay() UE_LOG(LogTemp, Warning, TEXT("PS_Editor: No MasterCatalog assigned.")); } - SceneSerializer = NewObject(this); - SceneSerializer->SetSelectionManager(SelectionManager); - // After undo/redo, deselect hidden actors and refresh gizmo UndoManager->OnUndoRedo.AddWeakLambda(this, [this]() { diff --git a/Unreal/Plugins/PS_Editor/Source/PS_Editor/UI/Widgets/PS_Editor_MainWidget.cpp b/Unreal/Plugins/PS_Editor/Source/PS_Editor/UI/Widgets/PS_Editor_MainWidget.cpp index af98593..b354e39 100644 --- a/Unreal/Plugins/PS_Editor/Source/PS_Editor/UI/Widgets/PS_Editor_MainWidget.cpp +++ b/Unreal/Plugins/PS_Editor/Source/PS_Editor/UI/Widgets/PS_Editor_MainWidget.cpp @@ -584,9 +584,11 @@ TSharedRef UPS_Editor_MainWidget::BuildSceneButtons() [ SAssignNew(BaseLevelCombo, SComboBox>) .OptionsSource(&BaseLevelOptions) - .OnSelectionChanged_Lambda([this](TSharedPtr Selected, ESelectInfo::Type) + .OnSelectionChanged_Lambda([this](TSharedPtr Selected, ESelectInfo::Type SelectInfo) { if (!Selected.IsValid()) return; + // Ignore programmatic selection (e.g. from NativeConstruct init) + if (SelectInfo == ESelectInfo::Direct) return; APS_Editor_PlayerController* EditorPC = Cast(GetOwningPlayer()); if (!EditorPC) return; @@ -706,6 +708,18 @@ void UPS_Editor_MainWidget::NativeConstruct() } } } + + // Restore scenario name in save field (from subsystem LastEdited) + if (UGameInstance* GI = EditorPC->GetGameInstance()) + { + if (UPS_Editor_GameInstanceSubsystem* Sub = GI->GetSubsystem()) + { + if (!Sub->LastEditedScenarioName.IsEmpty() && SaveNameField.IsValid()) + { + SaveNameField->SetText(FText::FromString(Sub->LastEditedScenarioName)); + } + } + } } PopulateSceneList();