Kaynağa Gözat

修复Unity运行时编译报错 (#539)

XuWei 2 yıl önce
ebeveyn
işleme
d15bb7edbf

+ 76 - 72
Unity/Assets/Scripts/Editor/Assembly/AssemblyEditor.cs

@@ -1,90 +1,94 @@
 using System.IO;
+using System.Threading;
 using UnityEditor;
 using UnityEngine;
 
 namespace ET
 {
-    public class AssemblyEditor
+    public static class AssemblyEditor
     {
+        public static SynchronizationContext UnitySynchronizationContext { get; private set; }
+        
         [InitializeOnLoadMethod]
         static void Initialize()
         {
+             UnitySynchronizationContext = SynchronizationContext.Current;
              //删掉Library中Unity编译的dll,不然在编辑器下Assembly.Load多个dll时,dll会与Library中的dll引用错乱
-            EditorApplication.playModeStateChanged += change =>
-            {
-                GlobalConfig globalConfig = Resources.Load<GlobalConfig>("GlobalConfig");
-                if (change == PlayModeStateChange.ExitingEditMode)
-                {
-                    if (globalConfig.EnableDll)
-                    {
-                        foreach (var dll in AssemblyTool.dllNames)
-                        {
-                            string dllFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.dll";
-                            if (File.Exists(dllFile))
-                            {
-                                string dllDisableFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.dll.DISABLE";
-                                if (File.Exists(dllDisableFile))
-                                {
-                                    File.Delete(dllDisableFile);
-                                }
+             EditorApplication.playModeStateChanged += change =>
+             {
+                 if (change == PlayModeStateChange.ExitingEditMode)
+                 {
+                     GlobalConfig globalConfig = Resources.Load<GlobalConfig>("GlobalConfig");
+                     if (globalConfig.EnableDll)
+                     {
+                         foreach (var dll in AssemblyTool.dllNames)
+                         {
+                             string dllFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.dll";
+                             if (File.Exists(dllFile))
+                             {
+                                 string dllDisableFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.dll.DISABLE";
+                                 if (File.Exists(dllDisableFile))
+                                 {
+                                     File.Delete(dllDisableFile);
+                                 }
 
-                                File.Move(dllFile, dllDisableFile);
-                            }
+                                 File.Move(dllFile, dllDisableFile);
+                             }
 
-                            string pdbFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.pdb";
-                            if (File.Exists(pdbFile))
-                            {
-                                string pdbDisableFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.pdb.DISABLE";
-                                if (File.Exists(pdbDisableFile))
-                                {
-                                    File.Delete(pdbDisableFile);
-                                }
+                             string pdbFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.pdb";
+                             if (File.Exists(pdbFile))
+                             {
+                                 string pdbDisableFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.pdb.DISABLE";
+                                 if (File.Exists(pdbDisableFile))
+                                 {
+                                     File.Delete(pdbDisableFile);
+                                 }
 
-                                File.Move(pdbFile, pdbDisableFile);
-                            }
-                        }
-                    }
-                    else
-                    {
-                        foreach (var dll in AssemblyTool.dllNames)
-                        {
-                            string dllFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.dll";
-                            string dllDisableFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.dll.DISABLE";
-                            if (File.Exists(dllFile))
-                            {
-                                if (File.Exists(dllDisableFile))
-                                {
-                                    File.Delete(dllDisableFile);
-                                }
-                            }
-                            else
-                            {
-                                if (File.Exists(dllDisableFile))
-                                {
-                                    File.Move(dllDisableFile, dllFile);
-                                }
-                            }
+                                 File.Move(pdbFile, pdbDisableFile);
+                             }
+                         }
+                     }
+                 }
+                 else if (change == PlayModeStateChange.ExitingPlayMode)
+                 {
+                     foreach (var dll in AssemblyTool.dllNames)
+                     {
+                         string dllFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.dll";
+                         string dllDisableFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.dll.DISABLE";
+                         if (File.Exists(dllFile))
+                         {
+                             if (File.Exists(dllDisableFile))
+                             {
+                                 File.Delete(dllDisableFile);
+                             }
+                         }
+                         else
+                         {
+                             if (File.Exists(dllDisableFile))
+                             {
+                                 File.Move(dllDisableFile, dllFile);
+                             }
+                         }
 
-                            string pdbDisableFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.pdb.DISABLE";
-                            string pdbFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.pdb";
-                            if (File.Exists(pdbFile))
-                            {
-                                if (File.Exists(pdbDisableFile))
-                                {
-                                    File.Delete(pdbDisableFile);
-                                }
-                            }
-                            else
-                            {
-                                if (File.Exists(pdbDisableFile))
-                                {
-                                    File.Move(pdbDisableFile, pdbFile);
-                                }
-                            }
-                        }
-                    }
-                }
-            };
+                         string pdbDisableFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.pdb.DISABLE";
+                         string pdbFile = $"{Application.dataPath}/../Library/ScriptAssemblies/{dll}.pdb";
+                         if (File.Exists(pdbFile))
+                         {
+                             if (File.Exists(pdbDisableFile))
+                             {
+                                 File.Delete(pdbDisableFile);
+                             }
+                         }
+                         else
+                         {
+                             if (File.Exists(pdbDisableFile))
+                             {
+                                 File.Move(pdbDisableFile, pdbFile);
+                             }
+                         }
+                     }
+                 }
+             };
         }
     }
 }

+ 39 - 11
Unity/Assets/Scripts/Editor/Assembly/AssemblyTool.cs

@@ -1,11 +1,13 @@
+using System;
 using System.IO;
+using System.Threading;
 using UnityEditor;
 using UnityEditor.Build.Player;
 using UnityEngine;
 
 namespace ET
 {
-    public class AssemblyTool
+    public static class AssemblyTool
     {
         public static readonly string[] dllNames = new[] { "Unity.Hotfix", "Unity.HotfixView", "Unity.Model", "Unity.ModelView" };
         
@@ -45,18 +47,34 @@ namespace ET
 
         public static void CompileDlls(BuildTarget target, ScriptCompilationOptions options = ScriptCompilationOptions.None)
         {
-            Directory.CreateDirectory(Define.BuildOutputDir);
-            BuildTargetGroup group = BuildPipeline.GetBuildTargetGroup(target);
-            ScriptCompilationSettings scriptCompilationSettings = new ScriptCompilationSettings();
-            scriptCompilationSettings.group = group;
-            scriptCompilationSettings.target = target;
-            scriptCompilationSettings.extraScriptingDefines = new[] { "UNITY_COMPILE" };
-            scriptCompilationSettings.options = options;
-            PlayerBuildInterface.CompilePlayerScripts(scriptCompilationSettings, Define.BuildOutputDir);
+            SynchronizationContext lastSynchronizationContext = null;
+            if (Application.isPlaying) //运行时编译需要UnitySynchronizationContext
+            {
+                lastSynchronizationContext = SynchronizationContext.Current;
+                SynchronizationContext.SetSynchronizationContext(AssemblyEditor.UnitySynchronizationContext);
+            }
+            try
+            {
+                Directory.CreateDirectory(Define.BuildOutputDir);
+                BuildTargetGroup group = BuildPipeline.GetBuildTargetGroup(target);
+                ScriptCompilationSettings scriptCompilationSettings = new ScriptCompilationSettings();
+                scriptCompilationSettings.group = group;
+                scriptCompilationSettings.target = target;
+                scriptCompilationSettings.extraScriptingDefines = new[] { "UNITY_COMPILE" };
+                scriptCompilationSettings.options = options;
+                PlayerBuildInterface.CompilePlayerScripts(scriptCompilationSettings, Define.BuildOutputDir);
 #if UNITY_2022
-            EditorUtility.ClearProgressBar();
+                EditorUtility.ClearProgressBar();
 #endif
-            Debug.Log("compile finish!!!");
+                Debug.Log("compile finish!!!");
+            }
+            finally
+            {
+                if (lastSynchronizationContext != null)
+                {
+                    SynchronizationContext.SetSynchronizationContext(lastSynchronizationContext);
+                }
+            }
         }
 
         static void CopyHotUpdateDlls()
@@ -127,6 +145,11 @@ namespace ET
             string asmdefDisableFile = $"{asmdefFile}.DISABLED";
             if (File.Exists(asmdefDisableFile))
             {
+                if (File.Exists(asmdefFile))
+                {
+                    File.Delete(asmdefFile);
+                    File.Delete($"{asmdefFile}.meta");
+                }
                 File.Move(asmdefDisableFile, asmdefFile);
                 File.Delete(asmdefDisableFile);
                 File.Delete($"{asmdefDisableFile}.meta");
@@ -138,6 +161,11 @@ namespace ET
             if (File.Exists(asmdefFile))
             {
                 string asmdefDisableFile = $"{asmdefFile}.DISABLED";
+                if (File.Exists(asmdefDisableFile))
+                {
+                    File.Delete(asmdefDisableFile);
+                    File.Delete($"{asmdefDisableFile}.meta");
+                }
                 File.Move(asmdefFile, asmdefDisableFile);
                 File.Delete(asmdefFile);
                 File.Delete($"{asmdefFile}.meta");

+ 0 - 5
Unity/Assets/Scripts/Editor/BuildEditor/BuildEditor.cs

@@ -147,11 +147,6 @@ namespace ET
                         break;
                 }
             }
-            
-            if(GUILayout.Button("Compile Dlls"))
-            {
-                AssemblyTool.CompileDlls(this.platformType);
-            }
 
             EPlayMode ePlayMode = (EPlayMode)EditorGUILayout.EnumPopup("EPlayMode: ", this.globalConfig.EPlayMode);
             if (ePlayMode != this.globalConfig.EPlayMode)

+ 4 - 4
Unity/Assets/Scripts/Editor/ToolbarExtension/CompileDllsToolbar.cs

@@ -6,15 +6,15 @@ namespace ET
 {
     public class CompileDllToolbar
     {
-        private static readonly GUIContent s_BuildReloadHotfixButtonGUIContent = new GUIContent("Reload", "Compile And Reload ET.Hotfix Dll When Playing.");
-        private static readonly GUIContent s_BuildHotfixModelButtonGUIContent = new GUIContent("Compile", "Compile All ET Dll.");
+        private static readonly GUIContent reloadButtonGUIContent = new GUIContent("Reload", "Compile And Reload ET.Hotfix Dll When Playing.");
+        private static readonly GUIContent compileButtonGUIContent = new GUIContent("Compile", "Compile All ET Dll.");
 
         [Toolbar(OnGUISide.Left, 0)]
         static void OnToolbarGUI()
         {
             EditorGUI.BeginDisabledGroup(!Application.isPlaying);
             {
-                if (GUILayout.Button(s_BuildReloadHotfixButtonGUIContent))
+                if (GUILayout.Button(reloadButtonGUIContent))
                 {
                     GlobalConfig globalConfig = Resources.Load<GlobalConfig>("GlobalConfig");
                     if (!globalConfig.EnableDll)
@@ -29,7 +29,7 @@ namespace ET
             }
             EditorGUI.EndDisabledGroup();
 
-            if (GUILayout.Button(s_BuildHotfixModelButtonGUIContent))
+            if (GUILayout.Button(compileButtonGUIContent))
             {
                 AssemblyTool.DoCompile();
                 Debug.Log("compile success!");