diff --git a/GlitchyEditor/src/Editor.bf b/GlitchyEditor/src/Editor.bf index 71cdb91..93ae1d3 100644 --- a/GlitchyEditor/src/Editor.bf +++ b/GlitchyEditor/src/Editor.bf @@ -232,9 +232,22 @@ namespace GlitchyEditor } /// Rebuilds the C# scripts. - public BuildScriptsBackgroundTask BuildScripts() + public BuildScriptsBackgroundTask BuildScripts(bool reloadAfterBuild = true) { + ScriptEngine.SuspendAssemblyWatcher(); + BuildScriptsBackgroundTask task = new .(EditorApp.Instance.Settings.ScriptSettings.DotNetExecutablePath, EditorApp.Instance.EditorLayer.CurrentProject, false){ DeleteWhenEnded = true }; + task.ContinueWith(new (task) => { + ScriptEngine.ResumeAssemblyWatcher(); + + if (reloadAfterBuild) + { + EditorApp.Instance.InvokeOnMainThread(new () => { + ScriptEngine.ReloadAssemblies(retainScriptData: true); + return true; + }); + } + }); EditorApp.Instance.BackgroundTaskManager.StartBackgroundTask(task); diff --git a/GlitchyEditor/src/EditorLayer.bf b/GlitchyEditor/src/EditorLayer.bf index 2dc11e4..9f35cbd 100644 --- a/GlitchyEditor/src/EditorLayer.bf +++ b/GlitchyEditor/src/EditorLayer.bf @@ -826,7 +826,9 @@ namespace GlitchyEditor if (allowRebuild && EditorApp.Instance.Settings.ScriptSettings.RebuildOnPlay) { - var task = _editor.BuildScripts(); + // Don't immediately reload the scripts after the build, because SetActiveScene will do that anyway. + var task = _editor.BuildScripts(reloadAfterBuild: false); + task.ContinueWith(new (t) => { // Continuations run in worker threads, invoke play on main thread! EditorApp.Instance.InvokeOnMainThread(new () => { diff --git a/GlitchyEngine/src/Scripting/ScriptEngine.bf b/GlitchyEngine/src/Scripting/ScriptEngine.bf index 5201e58..a70abff 100644 --- a/GlitchyEngine/src/Scripting/ScriptEngine.bf +++ b/GlitchyEngine/src/Scripting/ScriptEngine.bf @@ -212,6 +212,22 @@ static class ScriptEngine } static bool _requestingReload = false; + static bool _assemblyWatcherSuspended = false; + + public static void SuspendAssemblyWatcher() + { + Log.EngineLogger.Trace("Suspending assembly watching"); + + _assemblyWatcherSuspended = true; + _userAssemblyWatcher?.StopRaisingEvents(); + } + + public static void ResumeAssemblyWatcher() + { + Log.EngineLogger.Trace("Resuming assembly watching"); + _assemblyWatcherSuspended = false; + _userAssemblyWatcher?.StartRaisingEvents(); + } static void InitAssemblyWatcher() { @@ -244,7 +260,8 @@ static class ScriptEngine ReloadAssemblies(retainScriptData: true); _requestingReload = false; - _userAssemblyWatcher.StartRaisingEvents(); + if (_assemblyWatcherSuspended) + _userAssemblyWatcher.StartRaisingEvents(); return true; }); @@ -252,7 +269,8 @@ static class ScriptEngine }); } - _userAssemblyWatcher.StartRaisingEvents(); + if (_assemblyWatcherSuspended) + _userAssemblyWatcher.StartRaisingEvents(); } static void LoadScriptAssemblies()