BuildHelper.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using System.IO;
  2. using System.Linq;
  3. using System.Reflection;
  4. using UnityEditor;
  5. using UnityEngine;
  6. namespace ET
  7. {
  8. public static class BuildHelper
  9. {
  10. private const string relativeDirPrefix = "../Release";
  11. public static string BuildFolder = "../Release/{0}/StreamingAssets/";
  12. [InitializeOnLoadMethod]
  13. public static void ReGenerateProjectFiles()
  14. {
  15. if (Unity.CodeEditor.CodeEditor.CurrentEditor.GetType().Name== "RiderScriptEditor")
  16. {
  17. FieldInfo generator = Unity.CodeEditor.CodeEditor.CurrentEditor.GetType().GetField("m_ProjectGeneration", BindingFlags.Static | BindingFlags.NonPublic);
  18. var syncMethod = generator.FieldType.GetMethod("Sync");
  19. syncMethod.Invoke(generator.GetValue(Unity.CodeEditor.CodeEditor.CurrentEditor), null);
  20. }
  21. else
  22. {
  23. Unity.CodeEditor.CodeEditor.CurrentEditor.SyncAll();
  24. }
  25. Debug.Log("ReGenerateProjectFiles finished.");
  26. }
  27. #if ENABLE_CODES
  28. [MenuItem("ET/ChangeDefine/Remove ENABLE_CODES")]
  29. public static void RemoveEnableCodes()
  30. {
  31. EnableCodes(false);
  32. }
  33. #else
  34. [MenuItem("ET/ChangeDefine/Add ENABLE_CODES")]
  35. public static void AddEnableCodes()
  36. {
  37. EnableCodes(true);
  38. }
  39. #endif
  40. private static void EnableCodes(bool enable)
  41. {
  42. string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
  43. var ss = defines.Split(';').ToList();
  44. if (enable)
  45. {
  46. if (ss.Contains("ENABLE_CODES"))
  47. {
  48. return;
  49. }
  50. ss.Add("ENABLE_CODES");
  51. }
  52. else
  53. {
  54. if (!ss.Contains("ENABLE_CODES"))
  55. {
  56. return;
  57. }
  58. ss.Remove("ENABLE_CODES");
  59. }
  60. defines = string.Join(";", ss);
  61. PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, defines);
  62. AssetDatabase.SaveAssets();
  63. }
  64. #if ENABLE_VIEW
  65. [MenuItem("ET/ChangeDefine/Remove ENABLE_VIEW")]
  66. public static void RemoveEnableView()
  67. {
  68. EnableView(false);
  69. }
  70. #else
  71. [MenuItem("ET/ChangeDefine/Add ENABLE_VIEW")]
  72. public static void AddEnableView()
  73. {
  74. EnableView(true);
  75. }
  76. #endif
  77. private static void EnableView(bool enable)
  78. {
  79. string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
  80. var ss = defines.Split(';').ToList();
  81. if (enable)
  82. {
  83. if (ss.Contains("ENABLE_VIEW"))
  84. {
  85. return;
  86. }
  87. ss.Add("ENABLE_VIEW");
  88. }
  89. else
  90. {
  91. if (!ss.Contains("ENABLE_VIEW"))
  92. {
  93. return;
  94. }
  95. ss.Remove("ENABLE_VIEW");
  96. }
  97. defines = string.Join(";", ss);
  98. PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, defines);
  99. AssetDatabase.SaveAssets();
  100. }
  101. public static void Build(PlatformType type, BuildAssetBundleOptions buildAssetBundleOptions, BuildOptions buildOptions, bool isBuildExe, bool isContainAB, bool clearFolder)
  102. {
  103. BuildTarget buildTarget = BuildTarget.StandaloneWindows;
  104. string programName = "ET";
  105. string exeName = programName;
  106. switch (type)
  107. {
  108. case PlatformType.Windows:
  109. buildTarget = BuildTarget.StandaloneWindows64;
  110. exeName += ".exe";
  111. break;
  112. case PlatformType.Android:
  113. buildTarget = BuildTarget.Android;
  114. exeName += ".apk";
  115. break;
  116. case PlatformType.IOS:
  117. buildTarget = BuildTarget.iOS;
  118. break;
  119. case PlatformType.MacOS:
  120. buildTarget = BuildTarget.StandaloneOSX;
  121. break;
  122. case PlatformType.Linux:
  123. buildTarget = BuildTarget.StandaloneLinux64;
  124. break;
  125. }
  126. string fold = string.Format(BuildFolder, type);
  127. if (clearFolder && Directory.Exists(fold))
  128. {
  129. Directory.Delete(fold, true);
  130. }
  131. Directory.CreateDirectory(fold);
  132. UnityEngine.Debug.Log("start build assetbundle");
  133. BuildPipeline.BuildAssetBundles(fold, buildAssetBundleOptions, buildTarget);
  134. UnityEngine.Debug.Log("finish build assetbundle");
  135. if (isContainAB)
  136. {
  137. FileHelper.CleanDirectory("Assets/StreamingAssets/");
  138. FileHelper.CopyDirectory(fold, "Assets/StreamingAssets/");
  139. }
  140. if (isBuildExe)
  141. {
  142. AssetDatabase.Refresh();
  143. string[] levels = {
  144. "Assets/Scenes/Init.unity",
  145. };
  146. UnityEngine.Debug.Log("start build exe");
  147. BuildPipeline.BuildPlayer(levels, $"{relativeDirPrefix}/{exeName}", buildTarget, buildOptions);
  148. UnityEngine.Debug.Log("finish build exe");
  149. }
  150. else
  151. {
  152. if (isContainAB && type == PlatformType.Windows)
  153. {
  154. string targetPath = Path.Combine(relativeDirPrefix, $"{programName}_Data/StreamingAssets/");
  155. FileHelper.CleanDirectory(targetPath);
  156. Debug.Log($"src dir: {fold} target: {targetPath}");
  157. FileHelper.CopyDirectory(fold, targetPath);
  158. }
  159. }
  160. }
  161. }
  162. }