AssemblyTool.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using System.IO;
  2. using System.Threading;
  3. using UnityEditor;
  4. using UnityEditor.Build.Player;
  5. using UnityEngine;
  6. namespace ET
  7. {
  8. public static class AssemblyTool
  9. {
  10. public static readonly string[] dllNames = new[] { "Unity.Hotfix", "Unity.HotfixView", "Unity.Model", "Unity.ModelView" };
  11. private static BuildTarget GetBuildTarget(PlatformType type)
  12. {
  13. switch (type)
  14. {
  15. case PlatformType.Windows:
  16. return BuildTarget.StandaloneWindows64;
  17. case PlatformType.Android:
  18. return BuildTarget.Android;
  19. case PlatformType.IOS:
  20. return BuildTarget.iOS;
  21. case PlatformType.MacOS:
  22. return BuildTarget.StandaloneOSX;
  23. case PlatformType.Linux:
  24. return BuildTarget.StandaloneLinux64;
  25. }
  26. return BuildTarget.StandaloneWindows;
  27. }
  28. public static void RefreshCodeMode(CodeMode codeMode)
  29. {
  30. switch (codeMode)
  31. {
  32. case CodeMode.Client:
  33. Enable_UNITY_CLIENT();
  34. break;
  35. case CodeMode.Server:
  36. Enable_UNITY_SERVER();
  37. break;
  38. case CodeMode.ClientServer:
  39. Enable_UNITY_CLIENTSERVER();
  40. break;
  41. }
  42. }
  43. public static void DoCompile()
  44. {
  45. GlobalConfig globalConfig = Resources.Load<GlobalConfig>("GlobalConfig");
  46. ScriptCompilationOptions options = globalConfig.BuildType == BuildType.Debug
  47. ? ScriptCompilationOptions.DevelopmentBuild
  48. : ScriptCompilationOptions.None;
  49. CompileDlls(EditorUserBuildSettings.activeBuildTarget, options);
  50. CopyHotUpdateDlls();
  51. }
  52. public static void CompileDlls(PlatformType platform, ScriptCompilationOptions options = ScriptCompilationOptions.None)
  53. {
  54. CompileDlls(GetBuildTarget(platform), options);
  55. }
  56. public static void CompileDlls(BuildTarget target, ScriptCompilationOptions options = ScriptCompilationOptions.None)
  57. {
  58. //强制刷新一下,防止关闭auto refresh,编译出老代码
  59. AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
  60. SynchronizationContext lastSynchronizationContext = null;
  61. if (Application.isPlaying) //运行时编译需要UnitySynchronizationContext
  62. {
  63. lastSynchronizationContext = SynchronizationContext.Current;
  64. SynchronizationContext.SetSynchronizationContext(AssemblyEditor.UnitySynchronizationContext);
  65. }
  66. else
  67. {
  68. SynchronizationContext.SetSynchronizationContext(AssemblyEditor.UnitySynchronizationContext);
  69. }
  70. try
  71. {
  72. Directory.CreateDirectory(Define.BuildOutputDir);
  73. BuildTargetGroup group = BuildPipeline.GetBuildTargetGroup(target);
  74. ScriptCompilationSettings scriptCompilationSettings = new ScriptCompilationSettings();
  75. scriptCompilationSettings.group = group;
  76. scriptCompilationSettings.target = target;
  77. scriptCompilationSettings.extraScriptingDefines = new[] { "UNITY_COMPILE" };
  78. scriptCompilationSettings.options = options;
  79. PlayerBuildInterface.CompilePlayerScripts(scriptCompilationSettings, Define.BuildOutputDir);
  80. #if UNITY_2022
  81. EditorUtility.ClearProgressBar();
  82. #endif
  83. Debug.Log("compile finish!!!");
  84. }
  85. finally
  86. {
  87. if (Application.isPlaying && lastSynchronizationContext != null)
  88. {
  89. SynchronizationContext.SetSynchronizationContext(lastSynchronizationContext);
  90. }
  91. }
  92. }
  93. static void CopyHotUpdateDlls()
  94. {
  95. FileHelper.CleanDirectory(Define.CodeDir);
  96. foreach (var dllName in dllNames)
  97. {
  98. string sourceDll = $"{Define.BuildOutputDir}/{dllName}.dll";
  99. string sourcePdb = $"{Define.BuildOutputDir}/{dllName}.pdb";
  100. File.Copy(sourceDll, $"{Define.CodeDir}/{dllName}.dll.bytes", true);
  101. File.Copy(sourcePdb, $"{Define.CodeDir}/{dllName}.pdb.bytes", true);
  102. Debug.Log($"copy:{Define.BuildOutputDir}/{dllName} => {Define.CodeDir}/{dllName}");
  103. }
  104. Debug.Log("copy finish!!!");
  105. }
  106. public static void Enable_UNITY_CLIENT()
  107. {
  108. DisableAsmdef("Assets/Scripts/Model/Generate/Client/Ignore.asmdef");
  109. EnableAsmdef("Assets/Scripts/Model/Generate/Server/Ignore.asmdef");
  110. EnableAsmdef("Assets/Scripts/Model/Generate/ClientServer/Ignore.asmdef");
  111. DisableAsmdef("Assets/Scripts/Model/Client/Ignore.asmdef");
  112. EnableAsmdef("Assets/Scripts/Model/Server/Ignore.asmdef");
  113. DisableAsmdef("Assets/Scripts/Hotfix/Client/Ignore.asmdef");
  114. EnableAsmdef("Assets/Scripts/Hotfix/Server/Ignore.asmdef");
  115. DisableAsmdef("Assets/Scripts/HotfixView/Client/Ignore.asmdef");
  116. DisableAsmdef("Assets/Scripts/ModelView/Client/Ignore.asmdef");
  117. AssetDatabase.Refresh();
  118. }
  119. public static void Enable_UNITY_SERVER()
  120. {
  121. EnableAsmdef("Assets/Scripts/Model/Generate/Client/Ignore.asmdef");
  122. EnableAsmdef("Assets/Scripts/Model/Generate/Server/Ignore.asmdef");
  123. DisableAsmdef("Assets/Scripts/Model/Generate/ClientServer/Ignore.asmdef");
  124. DisableAsmdef("Assets/Scripts/Model/Client/Ignore.asmdef");
  125. DisableAsmdef("Assets/Scripts/Model/Server/Ignore.asmdef");
  126. DisableAsmdef("Assets/Scripts/Hotfix/Client/Ignore.asmdef");
  127. DisableAsmdef("Assets/Scripts/Hotfix/Server/Ignore.asmdef");
  128. EnableAsmdef("Assets/Scripts/HotfixView/Client/Ignore.asmdef");
  129. EnableAsmdef("Assets/Scripts/ModelView/Client/Ignore.asmdef");
  130. AssetDatabase.Refresh();
  131. }
  132. public static void Enable_UNITY_CLIENTSERVER()
  133. {
  134. EnableAsmdef("Assets/Scripts/Model/Generate/Client/Ignore.asmdef");
  135. EnableAsmdef("Assets/Scripts/Model/Generate/Server/Ignore.asmdef");
  136. DisableAsmdef("Assets/Scripts/Model/Generate/ClientServer/Ignore.asmdef");
  137. DisableAsmdef("Assets/Scripts/Model/Client/Ignore.asmdef");
  138. DisableAsmdef("Assets/Scripts/Model/Server/Ignore.asmdef");
  139. DisableAsmdef("Assets/Scripts/Hotfix/Client/Ignore.asmdef");
  140. DisableAsmdef("Assets/Scripts/Hotfix/Server/Ignore.asmdef");
  141. DisableAsmdef("Assets/Scripts/HotfixView/Client/Ignore.asmdef");
  142. DisableAsmdef("Assets/Scripts/ModelView/Client/Ignore.asmdef");
  143. AssetDatabase.Refresh();
  144. }
  145. static void EnableAsmdef(string asmdefFile)
  146. {
  147. string asmdefDisableFile = $"{asmdefFile}.DISABLED";
  148. if (File.Exists(asmdefDisableFile))
  149. {
  150. if (File.Exists(asmdefFile))
  151. {
  152. File.Delete(asmdefFile);
  153. File.Delete($"{asmdefFile}.meta");
  154. }
  155. File.Move(asmdefDisableFile, asmdefFile);
  156. File.Delete(asmdefDisableFile);
  157. File.Delete($"{asmdefDisableFile}.meta");
  158. }
  159. }
  160. static void DisableAsmdef(string asmdefFile)
  161. {
  162. if (File.Exists(asmdefFile))
  163. {
  164. string asmdefDisableFile = $"{asmdefFile}.DISABLED";
  165. if (File.Exists(asmdefDisableFile))
  166. {
  167. File.Delete(asmdefDisableFile);
  168. File.Delete($"{asmdefDisableFile}.meta");
  169. }
  170. File.Move(asmdefFile, asmdefDisableFile);
  171. File.Delete(asmdefFile);
  172. File.Delete($"{asmdefFile}.meta");
  173. }
  174. }
  175. }
  176. }