Merge branch 'feature/1151-play-mode-refactor-cleanup' of https://github.com/envision3d/FlaxEngine into envision3d-feature/1151-play-mode-refactor-cleanup
This commit is contained in:
@@ -1579,7 +1579,7 @@ namespace FlaxEditor
|
|||||||
private static void RequestStartPlayOnEditMode()
|
private static void RequestStartPlayOnEditMode()
|
||||||
{
|
{
|
||||||
if (Instance.StateMachine.IsEditMode)
|
if (Instance.StateMachine.IsEditMode)
|
||||||
Instance.Simulation.RequestStartPlay();
|
Instance.Simulation.RequestStartPlayScenes();
|
||||||
if (Instance.StateMachine.IsPlayMode)
|
if (Instance.StateMachine.IsPlayMode)
|
||||||
Instance.StateMachine.StateChanged -= RequestStartPlayOnEditMode;
|
Instance.StateMachine.StateChanged -= RequestStartPlayOnEditMode;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ namespace FlaxEditor.Modules
|
|||||||
private bool _updateOrFixedUpdateWasCalled;
|
private bool _updateOrFixedUpdateWasCalled;
|
||||||
private long _breakpointHangFlag;
|
private long _breakpointHangFlag;
|
||||||
private EditorWindow _enterPlayFocusedWindow;
|
private EditorWindow _enterPlayFocusedWindow;
|
||||||
|
private Scene[] _scenesToReload;
|
||||||
|
|
||||||
internal SimulationModule(Editor editor)
|
internal SimulationModule(Editor editor)
|
||||||
: base(editor)
|
: base(editor)
|
||||||
@@ -68,6 +69,22 @@ namespace FlaxEditor.Modules
|
|||||||
BreakpointHangEnd?.Invoke();
|
BreakpointHangEnd?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delegates between playing game and playing scenes in editor based on the user's editor preference.
|
||||||
|
/// </summary>
|
||||||
|
public void DelegatePlayOrStopPlayInEditor()
|
||||||
|
{
|
||||||
|
switch (Editor.Options.Options.Interface.PlayButtonAction)
|
||||||
|
{
|
||||||
|
case Options.InterfaceOptions.PlayAction.PlayGame:
|
||||||
|
Editor.Simulation.RequestPlayGameOrStopPlay();
|
||||||
|
return;
|
||||||
|
case Options.InterfaceOptions.PlayAction.PlayScenes:
|
||||||
|
Editor.Simulation.RequestPlayScenesOrStopPlay();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns true if play mode has been requested.
|
/// Returns true if play mode has been requested.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -76,7 +93,7 @@ namespace FlaxEditor.Modules
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requests start playing in editor.
|
/// Requests start playing in editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void RequestStartPlay()
|
public void RequestStartPlayScenes()
|
||||||
{
|
{
|
||||||
if (Editor.StateMachine.IsEditMode)
|
if (Editor.StateMachine.IsEditMode)
|
||||||
{
|
{
|
||||||
@@ -89,6 +106,57 @@ namespace FlaxEditor.Modules
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Requests playing game start or stop in editor from the project's configured FirstScene.
|
||||||
|
/// </summary>
|
||||||
|
public void RequestPlayGameOrStopPlay()
|
||||||
|
{
|
||||||
|
if (Editor.StateMachine.IsPlayMode)
|
||||||
|
{
|
||||||
|
RequestStopPlay();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RequestStartPlayGame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Requests start playing in editor from the project's configured FirstScene.
|
||||||
|
/// </summary>
|
||||||
|
public void RequestStartPlayGame()
|
||||||
|
{
|
||||||
|
if (!Editor.StateMachine.IsEditMode)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var firstScene = Content.Settings.GameSettings.Load().FirstScene;
|
||||||
|
if (firstScene == Guid.Empty)
|
||||||
|
{
|
||||||
|
if (Level.IsAnySceneLoaded)
|
||||||
|
Editor.Simulation.RequestStartPlayScenes();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_scenesToReload = Level.Scenes;
|
||||||
|
Level.UnloadAllScenes();
|
||||||
|
Level.LoadScene(firstScene);
|
||||||
|
|
||||||
|
Editor.PlayModeEnd += OnPlayGameEnd;
|
||||||
|
RequestPlayScenesOrStopPlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPlayGameEnd()
|
||||||
|
{
|
||||||
|
Editor.PlayModeEnd -= OnPlayGameEnd;
|
||||||
|
|
||||||
|
Level.UnloadAllScenes();
|
||||||
|
|
||||||
|
foreach (var scene in _scenesToReload)
|
||||||
|
Level.LoadScene(scene.ID);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requests stop playing in editor.
|
/// Requests stop playing in editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -106,14 +174,14 @@ namespace FlaxEditor.Modules
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requests the playing start or stop in editor.
|
/// Requests the playing scenes start or stop in editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void RequestPlayOrStopPlay()
|
public void RequestPlayScenesOrStopPlay()
|
||||||
{
|
{
|
||||||
if (Editor.StateMachine.IsPlayMode)
|
if (Editor.StateMachine.IsPlayMode)
|
||||||
RequestStopPlay();
|
RequestStopPlay();
|
||||||
else
|
else
|
||||||
RequestStartPlay();
|
RequestStartPlayScenes();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ namespace FlaxEditor.Modules
|
|||||||
private bool _progressFailed;
|
private bool _progressFailed;
|
||||||
|
|
||||||
ContextMenuSingleSelectGroup<int> _numberOfClientsGroup = new ContextMenuSingleSelectGroup<int>();
|
ContextMenuSingleSelectGroup<int> _numberOfClientsGroup = new ContextMenuSingleSelectGroup<int>();
|
||||||
private Scene[] _scenesToReload;
|
|
||||||
|
|
||||||
private ContextMenuButton _menuFileSaveScenes;
|
private ContextMenuButton _menuFileSaveScenes;
|
||||||
private ContextMenuButton _menuFileCloseScenes;
|
private ContextMenuButton _menuFileCloseScenes;
|
||||||
@@ -556,8 +555,8 @@ namespace FlaxEditor.Modules
|
|||||||
cm = MenuGame.ContextMenu;
|
cm = MenuGame.ContextMenu;
|
||||||
cm.VisibleChanged += OnMenuGameShowHide;
|
cm.VisibleChanged += OnMenuGameShowHide;
|
||||||
|
|
||||||
_menuGamePlayGame = cm.AddButton("Play Game", PlayGame);
|
_menuGamePlayGame = cm.AddButton("Play Game", Editor.Simulation.RequestPlayGameOrStopPlay);
|
||||||
_menuGamePlayCurrentScenes = cm.AddButton("Play Current Scenes", inputOptions.Play.ToString(), PlayScenes);
|
_menuGamePlayCurrentScenes = cm.AddButton("Play Current Scenes", Editor.Simulation.RequestPlayScenesOrStopPlay);
|
||||||
_menuGameStop = cm.AddButton("Stop Game", Editor.Simulation.RequestStopPlay);
|
_menuGameStop = cm.AddButton("Stop Game", Editor.Simulation.RequestStopPlay);
|
||||||
_menuGamePause = cm.AddButton("Pause", inputOptions.Pause.ToString(), Editor.Simulation.RequestPausePlay);
|
_menuGamePause = cm.AddButton("Pause", inputOptions.Pause.ToString(), Editor.Simulation.RequestPausePlay);
|
||||||
|
|
||||||
@@ -566,8 +565,8 @@ namespace FlaxEditor.Modules
|
|||||||
_numberOfClientsGroup.AddItemsToContextMenu(numberOfClientsMenu.ContextMenu);
|
_numberOfClientsGroup.AddItemsToContextMenu(numberOfClientsMenu.ContextMenu);
|
||||||
|
|
||||||
cm.AddSeparator();
|
cm.AddSeparator();
|
||||||
cm.AddButton("Cook & Run", CookAndRun).LinkTooltip("Runs Game Cooker to build the game for this platform and runs the game after.");
|
cm.AddButton("Cook & Run", Editor.Windows.GameCookerWin.BuildAndRun).LinkTooltip("Runs Game Cooker to build the game for this platform and runs the game after.");
|
||||||
cm.AddButton("Run cooked game", RunCookedGame).LinkTooltip("Runs the game build from the last cooking output. Use Cook&Play or Game Cooker first.");
|
cm.AddButton("Run cooked game", Editor.Windows.GameCookerWin.RunCooked).LinkTooltip("Runs the game build from the last cooking output. Use Cook&Play or Game Cooker first.");
|
||||||
|
|
||||||
// Tools
|
// Tools
|
||||||
MenuTools = MainMenu.AddButton("Tools");
|
MenuTools = MainMenu.AddButton("Tools");
|
||||||
@@ -658,23 +657,23 @@ namespace FlaxEditor.Modules
|
|||||||
Parent = mainWindow,
|
Parent = mainWindow,
|
||||||
};
|
};
|
||||||
|
|
||||||
_toolStripSaveAll = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Save64, Editor.SaveAll).LinkTooltip("Save all (Ctrl+S)");
|
_toolStripSaveAll = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Save64, Editor.SaveAll).LinkTooltip($"Save all ({inputOptions.Save})");
|
||||||
ToolStrip.AddSeparator();
|
ToolStrip.AddSeparator();
|
||||||
_toolStripUndo = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Undo64, Editor.PerformUndo).LinkTooltip("Undo (Ctrl+Z)");
|
_toolStripUndo = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Undo64, Editor.PerformUndo).LinkTooltip($"Undo ({inputOptions.Undo})");
|
||||||
_toolStripRedo = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Redo64, Editor.PerformRedo).LinkTooltip("Redo (Ctrl+Y)");
|
_toolStripRedo = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Redo64, Editor.PerformRedo).LinkTooltip($"Redo ({inputOptions.Redo})");
|
||||||
ToolStrip.AddSeparator();
|
ToolStrip.AddSeparator();
|
||||||
_toolStripTranslate = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Translate32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Translate).LinkTooltip("Change Gizmo tool mode to Translate (1)");
|
_toolStripTranslate = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Translate32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Translate).LinkTooltip($"Change Gizmo tool mode to Translate ({inputOptions.TranslateMode})");
|
||||||
_toolStripRotate = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Rotate32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Rotate).LinkTooltip("Change Gizmo tool mode to Rotate (2)");
|
_toolStripRotate = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Rotate32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Rotate).LinkTooltip($"Change Gizmo tool mode to Rotate ({inputOptions.RotateMode})");
|
||||||
_toolStripScale = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Scale32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Scale).LinkTooltip("Change Gizmo tool mode to Scale (3)");
|
_toolStripScale = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Scale32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Scale).LinkTooltip($"Change Gizmo tool mode to Scale ({inputOptions.ScaleMode})");
|
||||||
ToolStrip.AddSeparator();
|
ToolStrip.AddSeparator();
|
||||||
|
|
||||||
// Cook scenes
|
// Cook scenes
|
||||||
_toolStripBuildScenes = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Build64, Editor.BuildScenesOrCancel).LinkTooltip("Build scenes data - CSG, navmesh, static lighting, env probes - configurable via Build Actions in editor options (Ctrl+F10)");
|
_toolStripBuildScenes = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Build64, Editor.BuildScenesOrCancel).LinkTooltip("Build scenes data - CSG, navmesh, static lighting, env probes - configurable via Build Actions in editor options (Ctrl+F10)");
|
||||||
|
|
||||||
// Cook and run
|
// Cook and run
|
||||||
_toolStripCook = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.ShipIt64, CookAndRun).LinkTooltip("Cook & Run - build game for the current platform and run it locally");
|
_toolStripCook = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.ShipIt64, Editor.Windows.GameCookerWin.BuildAndRun).LinkTooltip("Cook & Run - build game for the current platform and run it locally");
|
||||||
_toolStripCook.ContextMenu = new ContextMenu();
|
_toolStripCook.ContextMenu = new ContextMenu();
|
||||||
_toolStripCook.ContextMenu.AddButton("Run cooked game", RunCookedGame);
|
_toolStripCook.ContextMenu.AddButton("Run cooked game", Editor.Windows.GameCookerWin.RunCooked);
|
||||||
_toolStripCook.ContextMenu.AddSeparator();
|
_toolStripCook.ContextMenu.AddSeparator();
|
||||||
var numberOfClientsMenu = _toolStripCook.ContextMenu.AddChildMenu("Number of game clients");
|
var numberOfClientsMenu = _toolStripCook.ContextMenu.AddChildMenu("Number of game clients");
|
||||||
_numberOfClientsGroup.AddItemsToContextMenu(numberOfClientsMenu.ContextMenu);
|
_numberOfClientsGroup.AddItemsToContextMenu(numberOfClientsMenu.ContextMenu);
|
||||||
@@ -682,7 +681,7 @@ namespace FlaxEditor.Modules
|
|||||||
ToolStrip.AddSeparator();
|
ToolStrip.AddSeparator();
|
||||||
|
|
||||||
// Play
|
// Play
|
||||||
_toolStripPlay = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Play64, OnPlayPressed).LinkTooltip("Play Game");
|
_toolStripPlay = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Play64, Editor.Simulation.DelegatePlayOrStopPlayInEditor).LinkTooltip($"Play In Editor ({inputOptions.Play})");
|
||||||
_toolStripPlay.ContextMenu = new ContextMenu();
|
_toolStripPlay.ContextMenu = new ContextMenu();
|
||||||
var playSubMenu = _toolStripPlay.ContextMenu.AddChildMenu("Play button action");
|
var playSubMenu = _toolStripPlay.ContextMenu.AddChildMenu("Play button action");
|
||||||
var playActionGroup = new ContextMenuSingleSelectGroup<InterfaceOptions.PlayAction>();
|
var playActionGroup = new ContextMenuSingleSelectGroup<InterfaceOptions.PlayAction>();
|
||||||
@@ -1039,65 +1038,6 @@ namespace FlaxEditor.Modules
|
|||||||
Editor.Options.Apply(options);
|
Editor.Options.Apply(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPlayPressed()
|
|
||||||
{
|
|
||||||
switch (Editor.Options.Options.Interface.PlayButtonAction)
|
|
||||||
{
|
|
||||||
case InterfaceOptions.PlayAction.PlayGame:
|
|
||||||
if (Editor.IsPlayMode)
|
|
||||||
Editor.Simulation.RequestStopPlay();
|
|
||||||
else
|
|
||||||
PlayGame();
|
|
||||||
return;
|
|
||||||
case InterfaceOptions.PlayAction.PlayScenes:
|
|
||||||
PlayScenes();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PlayGame()
|
|
||||||
{
|
|
||||||
var firstScene = GameSettings.Load().FirstScene;
|
|
||||||
if (firstScene == Guid.Empty)
|
|
||||||
{
|
|
||||||
if (Level.IsAnySceneLoaded)
|
|
||||||
Editor.Simulation.RequestStartPlay();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_scenesToReload = Level.Scenes;
|
|
||||||
Level.UnloadAllScenes();
|
|
||||||
Level.LoadScene(firstScene);
|
|
||||||
|
|
||||||
Editor.PlayModeEnd += OnPlayGameSceneEnding;
|
|
||||||
Editor.Simulation.RequestPlayOrStopPlay();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnPlayGameSceneEnding()
|
|
||||||
{
|
|
||||||
Editor.PlayModeEnd -= OnPlayGameSceneEnding;
|
|
||||||
|
|
||||||
Level.UnloadAllScenes();
|
|
||||||
|
|
||||||
foreach (var scene in _scenesToReload)
|
|
||||||
Level.LoadScene(scene.ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PlayScenes()
|
|
||||||
{
|
|
||||||
Editor.Simulation.RequestPlayOrStopPlay();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CookAndRun()
|
|
||||||
{
|
|
||||||
Editor.Windows.GameCookerWin.BuildAndRun();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RunCookedGame()
|
|
||||||
{
|
|
||||||
Editor.Windows.GameCookerWin.RunCooked();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnMainWindowClosing()
|
private void OnMainWindowClosing()
|
||||||
{
|
{
|
||||||
// Clear UI references (GUI cannot be used after window closing)
|
// Clear UI references (GUI cannot be used after window closing)
|
||||||
|
|||||||
@@ -303,7 +303,7 @@ namespace FlaxEditor.Windows
|
|||||||
Editor.Options.OptionsChanged += OnOptionsChanged;
|
Editor.Options.OptionsChanged += OnOptionsChanged;
|
||||||
OnOptionsChanged(Editor.Options.Options);
|
OnOptionsChanged(Editor.Options.Options);
|
||||||
|
|
||||||
InputActions.Add(options => options.Play, Editor.Simulation.RequestPlayOrStopPlay);
|
InputActions.Add(options => options.Play, Editor.Simulation.DelegatePlayOrStopPlayInEditor);
|
||||||
InputActions.Add(options => options.Pause, Editor.Simulation.RequestResumeOrPause);
|
InputActions.Add(options => options.Pause, Editor.Simulation.RequestResumeOrPause);
|
||||||
InputActions.Add(options => options.StepFrame, Editor.Simulation.RequestPlayOneFrame);
|
InputActions.Add(options => options.StepFrame, Editor.Simulation.RequestPlayOneFrame);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace FlaxEditor.Windows
|
|||||||
InputActions.Add(options => options.SelectAll, Editor.SceneEditing.SelectAllScenes);
|
InputActions.Add(options => options.SelectAll, Editor.SceneEditing.SelectAllScenes);
|
||||||
InputActions.Add(options => options.Delete, Editor.SceneEditing.Delete);
|
InputActions.Add(options => options.Delete, Editor.SceneEditing.Delete);
|
||||||
InputActions.Add(options => options.Search, () => Editor.Windows.SceneWin.Search());
|
InputActions.Add(options => options.Search, () => Editor.Windows.SceneWin.Search());
|
||||||
InputActions.Add(options => options.Play, Editor.Simulation.RequestPlayOrStopPlay);
|
InputActions.Add(options => options.Play, Editor.Simulation.DelegatePlayOrStopPlayInEditor);
|
||||||
InputActions.Add(options => options.Pause, Editor.Simulation.RequestResumeOrPause);
|
InputActions.Add(options => options.Pause, Editor.Simulation.RequestResumeOrPause);
|
||||||
InputActions.Add(options => options.StepFrame, Editor.Simulation.RequestPlayOneFrame);
|
InputActions.Add(options => options.StepFrame, Editor.Simulation.RequestPlayOneFrame);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user