Merge pull request #41362 from neikeq/fix-play-issues-after-ide-play-request

C#: Fix editor unable to play game after IDE PlayRequest
This commit is contained in:
Rémi Verschelde 2020-08-19 01:33:59 +02:00 committed by GitHub
commit f568cede8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 23 deletions

View File

@ -205,23 +205,8 @@ namespace GodotTools
if (File.Exists(editorScriptsMetadataPath)) if (File.Exists(editorScriptsMetadataPath))
File.Copy(editorScriptsMetadataPath, playerScriptsMetadataPath); File.Copy(editorScriptsMetadataPath, playerScriptsMetadataPath);
var currentPlayRequest = GodotSharpEditor.Instance.CurrentPlaySettings; if (GodotSharpEditor.Instance.SkipBuildBeforePlaying)
return true; // Requested play from an external editor/IDE which already built the project
if (currentPlayRequest != null)
{
if (currentPlayRequest.Value.HasDebugger)
{
// Set the environment variable that will tell the player to connect to the IDE debugger
// TODO: We should probably add a better way to do this
Environment.SetEnvironmentVariable("GODOT_MONO_DEBUGGER_AGENT",
"--debugger-agent=transport=dt_socket" +
$",address={currentPlayRequest.Value.DebuggerHost}:{currentPlayRequest.Value.DebuggerPort}" +
",server=n");
}
if (!currentPlayRequest.Value.BuildBeforePlaying)
return true; // Requested play from an external editor/IDE which already built the project
}
return BuildProjectBlocking("Debug"); return BuildProjectBlocking("Debug");
} }

View File

@ -38,7 +38,7 @@ namespace GodotTools
public BottomPanel BottomPanel { get; private set; } public BottomPanel BottomPanel { get; private set; }
public PlaySettings? CurrentPlaySettings { get; set; } public bool SkipBuildBeforePlaying { get; set; } = false;
public static string ProjectAssemblyName public static string ProjectAssemblyName
{ {

View File

@ -330,9 +330,10 @@ namespace GodotTools.Ides
{ {
DispatchToMainThread(() => DispatchToMainThread(() =>
{ {
GodotSharpEditor.Instance.CurrentPlaySettings = new PlaySettings(); // TODO: Add BuildBeforePlaying flag to PlayRequest
// Run the game
Internal.EditorRunPlay(); Internal.EditorRunPlay();
GodotSharpEditor.Instance.CurrentPlaySettings = null;
}); });
return Task.FromResult<Response>(new PlayResponse()); return Task.FromResult<Response>(new PlayResponse());
} }
@ -341,10 +342,22 @@ namespace GodotTools.Ides
{ {
DispatchToMainThread(() => DispatchToMainThread(() =>
{ {
GodotSharpEditor.Instance.CurrentPlaySettings = // Tell the build callback whether the editor already built the solution or not
new PlaySettings(request.DebuggerHost, request.DebuggerPort, request.BuildBeforePlaying ?? true); GodotSharpEditor.Instance.SkipBuildBeforePlaying = !(request.BuildBeforePlaying ?? true);
// Pass the debugger agent settings to the player via an environment variables
// TODO: It would be better if this was an argument in EditorRunPlay instead
Environment.SetEnvironmentVariable("GODOT_MONO_DEBUGGER_AGENT",
"--debugger-agent=transport=dt_socket" +
$",address={request.DebuggerHost}:{request.DebuggerPort}" +
",server=n");
// Run the game
Internal.EditorRunPlay(); Internal.EditorRunPlay();
GodotSharpEditor.Instance.CurrentPlaySettings = null;
// Restore normal settings
Environment.SetEnvironmentVariable("GODOT_MONO_DEBUGGER_AGENT", "");
GodotSharpEditor.Instance.SkipBuildBeforePlaying = false;
}); });
return Task.FromResult<Response>(new DebugPlayResponse()); return Task.FromResult<Response>(new DebugPlayResponse());
} }