From 57d4f204c74d698f9a30861ae6fdff3f3fccb88b Mon Sep 17 00:00:00 2001 From: David Sarno Date: Tue, 2 Sep 2025 09:42:29 -0700 Subject: [PATCH 1/2] bump sever version --- UnityMcpBridge/UnityMcpServer~/src/server_version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnityMcpBridge/UnityMcpServer~/src/server_version.txt b/UnityMcpBridge/UnityMcpServer~/src/server_version.txt index 94ff29c..944880f 100644 --- a/UnityMcpBridge/UnityMcpServer~/src/server_version.txt +++ b/UnityMcpBridge/UnityMcpServer~/src/server_version.txt @@ -1 +1 @@ -3.1.1 +3.2.0 From 8c2b4a2ca8c42dccfc287ee119fb982ea9017240 Mon Sep 17 00:00:00 2001 From: dsarno Date: Tue, 2 Sep 2025 14:13:13 -0700 Subject: [PATCH 2/2] Editor: Improve Windows auto-reload in ManageScript\n- Force synchronous ImportAsset and RequestScriptCompilation\n- Debounced refresh calls ImportAsset instead of Refresh\n- Path sanitation for Assets/ and slashes\n- Atomic writes with Windows-safe fallbacks\n- Nudge Editor tick for debounce reliability --- UnityMcpBridge/Editor/Tools/ManageScript.cs | 26 ++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/UnityMcpBridge/Editor/Tools/ManageScript.cs b/UnityMcpBridge/Editor/Tools/ManageScript.cs index 7ec6afe..73f4867 100644 --- a/UnityMcpBridge/Editor/Tools/ManageScript.cs +++ b/UnityMcpBridge/Editor/Tools/ManageScript.cs @@ -2568,6 +2568,8 @@ static class RefreshDebounce // Kick off a ticking callback that waits until the window has elapsed // from the last request before performing the refresh. EditorApplication.delayCall += () => Tick(window); + // Nudge the editor loop so ticks run even if the window is unfocused + EditorApplication.QueuePlayerLoopUpdate(); } private static void Tick(TimeSpan window) @@ -2595,7 +2597,10 @@ static class RefreshDebounce string[] toImport; lock (_lock) { toImport = _paths.ToArray(); _paths.Clear(); } foreach (var p in toImport) - AssetDatabase.ImportAsset(p, ImportAssetOptions.ForceUpdate); + { + var sp = ManageScriptRefreshHelpers.SanitizeAssetsPath(p); + AssetDatabase.ImportAsset(sp, ImportAssetOptions.ForceUpdate | ImportAssetOptions.ForceSynchronousImport); + } #if UNITY_EDITOR UnityEditor.Compilation.CompilationPipeline.RequestScriptCompilation(); #endif @@ -2607,16 +2612,31 @@ static class RefreshDebounce static class ManageScriptRefreshHelpers { + public static string SanitizeAssetsPath(string p) + { + if (string.IsNullOrEmpty(p)) return p; + p = p.Replace('\\', '/').Trim(); + if (p.StartsWith("unity://path/", StringComparison.OrdinalIgnoreCase)) + p = p.Substring("unity://path/".Length); + while (p.StartsWith("Assets/Assets/", StringComparison.OrdinalIgnoreCase)) + p = p.Substring("Assets/".Length); + if (!p.StartsWith("Assets/", StringComparison.OrdinalIgnoreCase)) + p = "Assets/" + p.TrimStart('/'); + return p; + } + public static void ScheduleScriptRefresh(string relPath) { - RefreshDebounce.Schedule(relPath, TimeSpan.FromMilliseconds(200)); + var sp = SanitizeAssetsPath(relPath); + RefreshDebounce.Schedule(sp, TimeSpan.FromMilliseconds(200)); } public static void ImportAndRequestCompile(string relPath, bool synchronous = true) { + var sp = SanitizeAssetsPath(relPath); var opts = ImportAssetOptions.ForceUpdate; if (synchronous) opts |= ImportAssetOptions.ForceSynchronousImport; - AssetDatabase.ImportAsset(relPath, opts); + AssetDatabase.ImportAsset(sp, opts); #if UNITY_EDITOR UnityEditor.Compilation.CompilationPipeline.RequestScriptCompilation(); #endif