AssemblyTool.cs 7.2 KB

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