// Copyright Epic Games, Inc. All Rights Reserved. #include "LyraEditorEngine.h" #include "Development/LyraDeveloperSettings.h" #include "Development/LyraPlatformEmulationSettings.h" #include "Engine/World.h" #include "Framework/Commands/InputBindingManager.h" #include "Framework/Commands/InputChord.h" #include "Framework/Commands/UICommandInfo.h" #include "Framework/Notifications/NotificationManager.h" #include "GameModes/LyraWorldSettings.h" #include "InputCoreTypes.h" #include "Internationalization/Internationalization.h" #include "Misc/AssertionMacros.h" #include "Misc/Optional.h" #include "PlayInEditorDataTypes.h" #include "Settings/ContentBrowserSettings.h" #include "Settings/LevelEditorPlaySettings.h" #include "Templates/Casts.h" #include "Templates/SharedPointer.h" #include "UObject/ObjectPtr.h" #include "Widgets/Notifications/SNotificationList.h" class IEngineLoop; #define LOCTEXT_NAMESPACE "LyraEditor" ULyraEditorEngine::ULyraEditorEngine(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { } void ULyraEditorEngine::Init(IEngineLoop* InEngineLoop) { Super::Init(InEngineLoop); } void ULyraEditorEngine::Start() { Super::Start(); } void ULyraEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) { Super::Tick(DeltaSeconds, bIdleMode); FirstTickSetup(); } void ULyraEditorEngine::FirstTickSetup() { if (bFirstTickSetup) { return; } bFirstTickSetup = true; // Force show plugin content on load. GetMutableDefault()->SetDisplayPluginFolders(true); // Set PIE to default to Shift+Escape if no user overrides have been set. { FInputChord OutPrimaryChord, OutSecondaryChord; FInputBindingManager::Get().GetUserDefinedChord("PlayWorld", "StopPlaySession", EMultipleKeyBindingIndex::Primary, OutPrimaryChord); FInputBindingManager::Get().GetUserDefinedChord("PlayWorld", "StopPlaySession", EMultipleKeyBindingIndex::Secondary, OutSecondaryChord); // Is there already a user setting for stopping PIE? Then don't do this. if (!(OutPrimaryChord.IsValidChord() || OutSecondaryChord.IsValidChord())) { TSharedPtr StopCommand = FInputBindingManager::Get().FindCommandInContext("PlayWorld", "StopPlaySession"); if (ensure(StopCommand)) { // Shift+Escape to exit PIE. Some folks like Ctrl+Q, if that's the case, change it here for your team. StopCommand->SetActiveChord(FInputChord(EKeys::Escape, true, false, false, false), EMultipleKeyBindingIndex::Primary); FInputBindingManager::Get().NotifyActiveChordChanged(*StopCommand, EMultipleKeyBindingIndex::Primary); } } } } FGameInstancePIEResult ULyraEditorEngine::PreCreatePIEInstances(const bool bAnyBlueprintErrors, const bool bStartInSpectatorMode, const float PIEStartTime, const bool bSupportsOnlinePIE, int32& InNumOnlinePIEInstances) { if (const ALyraWorldSettings* LyraWorldSettings = Cast(EditorWorld->GetWorldSettings())) { if (LyraWorldSettings->ForceStandaloneNetMode) { EPlayNetMode OutPlayNetMode; PlaySessionRequest->EditorPlaySettings->GetPlayNetMode(OutPlayNetMode); if (OutPlayNetMode != PIE_Standalone) { PlaySessionRequest->EditorPlaySettings->SetPlayNetMode(PIE_Standalone); FNotificationInfo Info(LOCTEXT("ForcingStandaloneForFrontend", "Forcing NetMode: Standalone for the Frontend")); Info.ExpireDuration = 2.0f; FSlateNotificationManager::Get().AddNotification(Info); } } } //@TODO: Should add delegates that a *non-editor* module could bind to for PIE start/stop instead of poking directly GetDefault()->OnPlayInEditorStarted(); GetDefault()->OnPlayInEditorStarted(); // FGameInstancePIEResult Result = Super::PreCreatePIEServerInstance(bAnyBlueprintErrors, bStartInSpectatorMode, PIEStartTime, bSupportsOnlinePIE, InNumOnlinePIEInstances); return Result; } #undef LOCTEXT_NAMESPACE