فهرست منبع

去掉LoadMode去掉Code.dll,客户端也改成加载Model.dll跟Hotfix.dll,这样客户端也可以热重载Hotfix.dll,玩家不用重启游戏即可修复一些逻辑bug

tanghai 3 سال پیش
والد
کامیت
b30e8573ed

+ 1 - 5
.gitignore

@@ -71,11 +71,7 @@ Server/.DS_Store
 /Unity/Unity.Codes.csproj
 /Unity/Unity.Ignore.csproj
 Publish/
-/Unity/HybridCLRData/LocalIl2CppData
-/Unity/HybridCLRData/hybridclr_repo
-/Unity/HybridCLRData/il2cpp_plus_repo
-/Unity/HybridCLRData/AssembliesPostIl2CppStrip
-/Unity/HybridCLRData/HotFixDlls
+/Unity/Assets/Bundles/Code/*
 /Unity/Assets/Bundles/AssetBundleOutput.meta
 /Unity/Assets/Bundles/AssetBundleOutput
 /Unity/Assets/Bundles/AssetBundleSourceData

+ 1 - 4
Unity/Assets/Scripts/Codes/Model/Share/Entry.cs

@@ -1,7 +1,4 @@
-using System.Timers;
-using ICSharpCode.SharpZipLib.Zip;
-
-namespace ET
+namespace ET
 {
     namespace EventType
     {

+ 34 - 115
Unity/Assets/Scripts/Editor/BuildEditor/BuildAssemblieEditor.cs → Unity/Assets/Scripts/Editor/BuildEditor/BuildAssembliesHelper.cs

@@ -9,71 +9,14 @@ using UnityEditor.Compilation;
 
 namespace ET
 {
-    public static class BuildAssemblieEditor
+    public static class BuildAssembliesHelper
     {
-        private const string CodeDir = "Assets/Bundles/Code/";
+        public const string CodeDir = "Assets/Bundles/Code/";
 
-        public static void BuildCode(CodeOptimization codeOptimization, GlobalConfig globalConfig)
-        {
-            List<string> codes;
-            switch (globalConfig.CodeMode)
-            {
-                case CodeMode.Client:
-                    codes = new List<string>()
-                    {
-                        "Assets/Scripts/Codes/Model/Generate/Client",
-                        "Assets/Scripts/Codes/Model/Share",
-                        "Assets/Scripts/Codes/Hotfix/Share",
-                        "Assets/Scripts/Codes/Model/Client",
-                        "Assets/Scripts/Codes/ModelView/Client",
-                        "Assets/Scripts/Codes/Hotfix/Client",
-                        "Assets/Scripts/Codes/HotfixView/Client"
-                    };
-                    break;
-                case CodeMode.Server:
-                    codes = new List<string>()
-                    {
-                        "Assets/Scripts/Codes/Model/Generate/Server",
-                        "Assets/Scripts/Codes/Model/Share",
-                        "Assets/Scripts/Codes/Hotfix/Share",
-                        "Assets/Scripts/Codes/Model/Server",
-                        "Assets/Scripts/Codes/Hotfix/Server",
-                        "Assets/Scripts/Codes/Model/Client",
-                        "Assets/Scripts/Codes/Hotfix/Client",
-                    };
-                    break;
-                case CodeMode.ClientServer:
-                    codes = new List<string>()
-                    {
-                        "Assets/Scripts/Codes/Model/Generate/ClientServer",
-                        "Assets/Scripts/Codes/Model/Share",
-                        "Assets/Scripts/Codes/Hotfix/Share",
-                        "Assets/Scripts/Codes/Model/Client",
-                        "Assets/Scripts/Codes/ModelView/Client",
-                        "Assets/Scripts/Codes/Hotfix/Client",
-                        "Assets/Scripts/Codes/HotfixView/Client",
-                        "Assets/Scripts/Codes/Model/Server",
-                        "Assets/Scripts/Codes/Hotfix/Server",
-                    };
-                    break;
-                default:
-                    throw new Exception("not found enum");
-            }
-
-            BuildAssemblieEditor.BuildMuteAssembly("Code", codes, Array.Empty<string>(), codeOptimization, globalConfig.CodeMode);
-
-            AfterCompiling();
-            
-            AssetDatabase.Refresh();
-            
-            //反射获取当前Game视图,提示编译完成
-            ShowNotification("Build Code Success");
-        }
-        
         public static void BuildModel(CodeOptimization codeOptimization, GlobalConfig globalConfig)
         {
             List<string> codes;
-            
+
             switch (globalConfig.CodeMode)
             {
                 case CodeMode.Client:
@@ -107,13 +50,14 @@ namespace ET
                 default:
                     throw new Exception("not found enum");
             }
-            
-            BuildAssemblieEditor.BuildMuteAssembly("Model", codes, Array.Empty<string>(), codeOptimization, globalConfig.CodeMode);
-            
-            //反射获取当前Game视图,提示编译完成
-            ShowNotification("Build Model Success");
+
+            BuildAssembliesHelper.BuildMuteAssembly("Model", codes, Array.Empty<string>(), codeOptimization, globalConfig.CodeMode);
+
+            File.Copy(Path.Combine(Define.BuildOutputDir, $"Model.dll"), Path.Combine(CodeDir, $"Model.dll.bytes"), true);
+            File.Copy(Path.Combine(Define.BuildOutputDir, $"Model.pdb"), Path.Combine(CodeDir, $"Model.pdb.bytes"), true);
+            Debug.Log("copy Model.dll to Bundles/Code success!");
         }
-        
+
         public static void BuildHotfix(CodeOptimization codeOptimization, GlobalConfig globalConfig)
         {
             string[] logicFiles = Directory.GetFiles(Define.BuildOutputDir, "Hotfix_*");
@@ -122,10 +66,9 @@ namespace ET
                 File.Delete(file);
             }
 
-            
             int random = RandomGenerator.RandomNumber(100000000, 999999999);
             string logicFile = $"Hotfix_{random}";
-            
+
             List<string> codes;
             switch (globalConfig.CodeMode)
             {
@@ -140,9 +83,7 @@ namespace ET
                 case CodeMode.Server:
                     codes = new List<string>()
                     {
-                        "Assets/Scripts/Codes/Hotfix/Share/",
-                        "Assets/Scripts/Codes/Hotfix/Server/",
-                        "Assets/Scripts/Codes/Hotfix/Client/",
+                        "Assets/Scripts/Codes/Hotfix/Share/", "Assets/Scripts/Codes/Hotfix/Server/", "Assets/Scripts/Codes/Hotfix/Client/",
                     };
                     break;
                 case CodeMode.ClientServer:
@@ -157,21 +98,24 @@ namespace ET
                 default:
                     throw new Exception("not found enum");
             }
-            
-            BuildAssemblieEditor.BuildMuteAssembly(logicFile, codes, new[]{Path.Combine(Define.BuildOutputDir, "Model.dll")}, codeOptimization, globalConfig.CodeMode);
-            
-            //反射获取当前Game视图,提示编译完成
-            ShowNotification("Build Hotfix Success");
+
+            BuildAssembliesHelper.BuildMuteAssembly(logicFile, codes, new[] { Path.Combine(Define.BuildOutputDir, "Model.dll") }, codeOptimization,
+                globalConfig.CodeMode);
+
+            File.Copy(Path.Combine(Define.BuildOutputDir, $"{logicFile}.dll"), Path.Combine(CodeDir, $"Hotfix.dll.bytes"), true);
+            File.Copy(Path.Combine(Define.BuildOutputDir, $"{logicFile}.pdb"), Path.Combine(CodeDir, $"Hotfix.pdb.bytes"), true);
+            Debug.Log("copy Hotfix.dll to Bundles/Code success!");
         }
 
         private static void BuildMuteAssembly(
-                string assemblyName, List<string> CodeDirectorys, 
-                string[] additionalReferences, CodeOptimization codeOptimization, CodeMode codeMode = CodeMode.Client)
-        {            
+            string assemblyName, List<string> CodeDirectorys,
+            string[] additionalReferences, CodeOptimization codeOptimization, CodeMode codeMode = CodeMode.Client)
+        {
             if (!Directory.Exists(Define.BuildOutputDir))
             {
                 Directory.CreateDirectory(Define.BuildOutputDir);
             }
+
             List<string> scripts = new List<string>();
             for (int i = 0; i < CodeDirectorys.Count; i++)
             {
@@ -191,7 +135,7 @@ namespace ET
             Directory.CreateDirectory(Define.BuildOutputDir);
 
             AssemblyBuilder assemblyBuilder = new AssemblyBuilder(dllPath, scripts.ToArray());
-            
+
             if (codeMode == CodeMode.Client)
             {
                 assemblyBuilder.excludeReferences = new string[]
@@ -199,15 +143,15 @@ namespace ET
                     "DnsClient.dll", 
                     "MongoDB.Driver.Core.dll", 
                     "MongoDB.Driver.dll", 
-                    "MongoDB.Driver.Legacy.dll", 
+                    "MongoDB.Driver.Legacy.dll",
                     "MongoDB.Libmongocrypt.dll", 
                     "SharpCompress.dll", 
-                    "System.Buffers.dll",
+                    "System.Buffers.dll", 
                     "System.Runtime.CompilerServices.Unsafe.dll",
                     "System.Text.Encoding.CodePages.dll"
                 };
             }
-            
+
             //启用UnSafe
             assemblyBuilder.compilerOptions.AllowUnsafeCode = true;
 
@@ -218,7 +162,7 @@ namespace ET
             // assemblyBuilder.compilerOptions.ApiCompatibilityLevel = ApiCompatibilityLevel.NET_4_6;
 
             assemblyBuilder.additionalReferences = additionalReferences;
-            
+
             assemblyBuilder.flags = AssemblyBuilderFlags.None;
             //AssemblyBuilderFlags.None                 正常发布
             //AssemblyBuilderFlags.DevelopmentBuild     开发模式打包
@@ -229,9 +173,9 @@ namespace ET
 
             assemblyBuilder.buildTargetGroup = buildTargetGroup;
 
-            assemblyBuilder.buildStarted += delegate(string assemblyPath) { Debug.LogFormat("build start:" + assemblyPath); };
+            assemblyBuilder.buildStarted += assemblyPath => Debug.LogFormat("build start:" + assemblyPath);
 
-            assemblyBuilder.buildFinished += delegate(string assemblyPath, CompilerMessage[] compilerMessages)
+            assemblyBuilder.buildFinished += (assemblyPath, compilerMessages) =>
             {
                 int errorCount = compilerMessages.Count(m => m.type == CompilerMessageType.Error);
                 int warningCount = compilerMessages.Count(m => m.type == CompilerMessageType.Warning);
@@ -250,50 +194,25 @@ namespace ET
                         if (compilerMessages[i].type == CompilerMessageType.Error)
                         {
                             string filename = Path.GetFullPath(compilerMessages[i].file);
-                            Debug.LogError($"{compilerMessages[i].message} (at <a href=\"file:///{filename}/\" line=\"{compilerMessages[i].line}\">{Path.GetFileName(filename)}</a>)");
+                            Debug.LogError(
+                                $"{compilerMessages[i].message} (at <a href=\"file:///{filename}/\" line=\"{compilerMessages[i].line}\">{Path.GetFileName(filename)}</a>)");
                         }
                     }
                 }
             };
-            
+
             //开始构建
             if (!assemblyBuilder.Build())
             {
                 Debug.LogErrorFormat("build fail:" + assemblyBuilder.assemblyPath);
                 return;
             }
-            
+
             while (EditorApplication.isCompiling)
             {
                 // 主线程sleep并不影响编译线程
                 Thread.Sleep(1);
             }
         }
-
-        private static void AfterCompiling()
-        {
-            Debug.Log("Compiling finish");
-
-            Directory.CreateDirectory(CodeDir);
-            File.Copy(Path.Combine(Define.BuildOutputDir, "Code.dll"), Path.Combine(CodeDir, "Code.dll.bytes"), true);
-            File.Copy(Path.Combine(Define.BuildOutputDir, "Code.pdb"), Path.Combine(CodeDir, "Code.pdb.bytes"), true);
-            Debug.Log("copy Code.dll to Bundles/Code success!");
-            
-            // 设置ab包
-            AssetImporter assetImporter = AssetImporter.GetAtPath("Assets/Bundles/Code");
-            assetImporter.assetBundleName = "Code.unity3d";
-            AssetDatabase.SaveAssets();
-            AssetDatabase.Refresh();
-            Debug.Log("set assetbundle success!");
-            
-            Debug.Log("build success!");
-        }
-
-        public static void ShowNotification(string tips)
-        {
-            var game = EditorWindow.GetWindow(typeof(EditorWindow).Assembly.GetType("UnityEditor.GameView"));
-            game?.ShowNotification(new GUIContent($"{tips}"));
-        }
     }
-    
 }

+ 1 - 1
Unity/Assets/Scripts/Editor/BuildEditor/BuildAssemblieEditor.cs.meta → Unity/Assets/Scripts/Editor/BuildEditor/BuildAssembliesHelper.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: db39c7b028ad96444bec9e439e89d35e
+guid: d1b75d276b7b6dd469bf5dccba9a5a80
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 36 - 8
Unity/Assets/Scripts/Editor/BuildEditor/BuildEditor.cs

@@ -112,17 +112,20 @@ namespace ET
 			GUILayout.Label("");
 			GUILayout.Label("Code Compile:");
 			
-			this.globalConfig.LoadMode = (LoadMode)EditorGUILayout.EnumPopup("LoadMode: ", this.globalConfig.LoadMode);
-			
 			this.globalConfig.CodeMode = (CodeMode)EditorGUILayout.EnumPopup("CodeMode: ", this.globalConfig.CodeMode);
 			
-			if (GUILayout.Button("BuildCode"))
+			if (GUILayout.Button("BuildModelAndHotfix"))
 			{
 				if (Define.EnableCodes)
 				{
 					throw new Exception("now in ENABLE_CODES mode, do not need Build!");
 				}
-				BuildAssemblieEditor.BuildCode(this.codeOptimization, globalConfig);
+				BuildAssembliesHelper.BuildModel(this.codeOptimization, globalConfig);
+				BuildAssembliesHelper.BuildHotfix(this.codeOptimization, globalConfig);
+
+				AfterCompiling();
+				
+				ShowNotification("Build Model And Hotfix Success!");
 			}
 			
 			if (GUILayout.Button("BuildModel"))
@@ -131,7 +134,11 @@ namespace ET
 				{
 					throw new Exception("now in ENABLE_CODES mode, do not need Build!");
 				}
-				BuildAssemblieEditor.BuildModel(this.codeOptimization, globalConfig);
+				BuildAssembliesHelper.BuildModel(this.codeOptimization, globalConfig);
+
+				AfterCompiling();
+				
+				ShowNotification("Build Model Success!");
 			}
 			
 			if (GUILayout.Button("BuildHotfix"))
@@ -140,7 +147,11 @@ namespace ET
 				{
 					throw new Exception("now in ENABLE_CODES mode, do not need Build!");
 				}
-				BuildAssemblieEditor.BuildHotfix(this.codeOptimization, globalConfig);
+				BuildAssembliesHelper.BuildHotfix(this.codeOptimization, globalConfig);
+
+				AfterCompiling();
+				
+				ShowNotification("Build Hotfix Success!");
 			}
 			
 			if (GUILayout.Button("ExcelExporter"))
@@ -159,10 +170,27 @@ namespace ET
 			{
 				ToolsEditor.Proto2CS();
 			}
-			
-
 
 			GUILayout.Space(5);
 		}
+		
+		private static void AfterCompiling()
+		{
+			Directory.CreateDirectory(BuildAssembliesHelper.CodeDir);
+
+			// 设置ab包
+			AssetImporter assetImporter = AssetImporter.GetAtPath("Assets/Bundles/Code");
+			assetImporter.assetBundleName = "Code.unity3d";
+			AssetDatabase.SaveAssets();
+			AssetDatabase.Refresh();
+            
+			Debug.Log("build success!");
+		}
+		
+		public static void ShowNotification(string tips)
+		{
+			EditorWindow game = EditorWindow.GetWindow(typeof(EditorWindow).Assembly.GetType("UnityEditor.GameView"));
+			game?.ShowNotification(new GUIContent($"{tips}"));
+		}
 	}
 }

+ 35 - 40
Unity/Assets/Scripts/Mono/CodeLoader.cs

@@ -28,63 +28,58 @@ namespace ET
 				
 				IStaticMethod start = new StaticMethod(assembly, "ET.Entry", "Start");
 				start.Run();
-				return;
 			}
-
-
-			switch (Init.Instance.GlobalConfig.LoadMode)
+			else
 			{
-				case LoadMode.Mono:
+				byte[] assBytes;
+				byte[] pdbBytes;
+				if (!Define.IsEditor)
 				{
 					Dictionary<string, UnityEngine.Object> dictionary = AssetsBundleHelper.LoadBundle("code.unity3d");
-					byte[] assBytes = ((TextAsset)dictionary["Code.dll"]).bytes;
-					byte[] pdbBytes = ((TextAsset)dictionary["Code.pdb"]).bytes;
-					
-					assembly = Assembly.Load(assBytes, pdbBytes);
-					
-					Dictionary<string, Type> types = AssemblyHelper.GetAssemblyTypes(typeof (Game).Assembly, this.assembly);
-					EventSystem.Instance.Add(types);
-					
-					IStaticMethod start = new StaticMethod(assembly, "ET.Entry", "Start");
-					start.Run();
-					break;
+					assBytes = ((TextAsset)dictionary["Model.dll"]).bytes;
+					pdbBytes = ((TextAsset)dictionary["Model.pdb"]).bytes;
 				}
-				case LoadMode.Reload:
+				else
 				{
-					byte[] assBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, "Model.dll"));
-					byte[] pdbBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, "Model.pdb"));
-					
-					assembly = Assembly.Load(assBytes, pdbBytes);
-					this.LoadHotfix();
-					
-					IStaticMethod start = new StaticMethod(assembly, "ET.Entry", "Start");
-					start.Run();
-					break;
+					assBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, "Model.dll"));
+					pdbBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, "Model.pdb"));
 				}
+			
+				assBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, "Model.dll"));
+				pdbBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, "Model.pdb"));
+			
+				assembly = Assembly.Load(assBytes, pdbBytes);
+				this.LoadHotfix();
+			
+				IStaticMethod start = new StaticMethod(assembly, "ET.Entry", "Start");
+				start.Run();
 			}
 		}
 
-		// 热重载调用下面两个方法
-		// CodeLoader.Instance.LoadLogic();
-		// EventSystem.Instance.Load();
+		// 热重载调用该方法
 		public void LoadHotfix()
 		{
-			if (Init.Instance.GlobalConfig.LoadMode != LoadMode.Reload)
+			byte[] assBytes;
+			byte[] pdbBytes;
+			if (!Define.IsEditor)
 			{
-				throw new Exception("CodeMode != Reload!");
+				Dictionary<string, UnityEngine.Object> dictionary = AssetsBundleHelper.LoadBundle("code.unity3d");
+				assBytes = ((TextAsset)dictionary["Hotfix.dll"]).bytes;
+				pdbBytes = ((TextAsset)dictionary["Hotfix.pdb"]).bytes;
 			}
-			
-			// 傻屌Unity在这里搞了个傻逼优化,认为同一个路径的dll,返回的程序集就一样。所以这里每次编译都要随机名字
-			string[] logicFiles = Directory.GetFiles(Define.BuildOutputDir, "Hotfix_*.dll");
-			if (logicFiles.Length != 1)
+			else
 			{
-				throw new Exception("Logic dll count != 1");
+				// 傻屌Unity在这里搞了个傻逼优化,认为同一个路径的dll,返回的程序集就一样。所以这里每次编译都要随机名字
+				string[] logicFiles = Directory.GetFiles(Define.BuildOutputDir, "Hotfix_*.dll");
+				if (logicFiles.Length != 1)
+				{
+					throw new Exception("Logic dll count != 1");
+				}
+				string logicName = Path.GetFileNameWithoutExtension(logicFiles[0]);
+				assBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, $"{logicName}.dll"));
+				pdbBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, $"{logicName}.pdb"));
 			}
 
-			string logicName = Path.GetFileNameWithoutExtension(logicFiles[0]);
-			byte[] assBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, $"{logicName}.dll"));
-			byte[] pdbBytes = File.ReadAllBytes(Path.Combine(Define.BuildOutputDir, $"{logicName}.pdb"));
-
 			Assembly hotfixAssembly = Assembly.Load(assBytes, pdbBytes);
 			
 			Dictionary<string, Type> types = AssemblyHelper.GetAssemblyTypes(typeof (Game).Assembly, this.assembly, hotfixAssembly);

+ 0 - 9
Unity/Assets/Scripts/Mono/MonoBehaviour/GlobalConfig.cs

@@ -2,13 +2,6 @@
 
 namespace ET
 {
-    // 1 mono模式 2 mono热重载模式 3 Codes模式,将逻辑代码作为编辑器dll,编辑器可以调用到逻辑代码
-    public enum LoadMode
-    {
-        Mono = 1,
-        Reload = 2,
-    }
-
     public enum CodeMode
     {
         Client = 1,
@@ -19,8 +12,6 @@ namespace ET
     [CreateAssetMenu(menuName = "ET/CreateGlobalConfig", fileName = "GlobalConfig", order = 0)]
     public class GlobalConfig: ScriptableObject
     {
-        public LoadMode LoadMode;
-
         public CodeMode CodeMode;
     }
 }