BuildEditor.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using UnityEditor;
  7. using UnityEditor.Compilation;
  8. using UnityEngine;
  9. using Debug = UnityEngine.Debug;
  10. namespace ET
  11. {
  12. public enum PlatformType
  13. {
  14. None,
  15. Android,
  16. IOS,
  17. Windows,
  18. MacOS,
  19. Linux
  20. }
  21. public enum BuildType
  22. {
  23. Development,
  24. Release,
  25. }
  26. public class BuildEditor : EditorWindow
  27. {
  28. private PlatformType activePlatform;
  29. private PlatformType platformType;
  30. private bool clearFolder;
  31. private bool isBuildExe;
  32. private bool isContainAB;
  33. private CodeOptimization codeOptimization = CodeOptimization.Debug;
  34. private BuildOptions buildOptions;
  35. private BuildAssetBundleOptions buildAssetBundleOptions = BuildAssetBundleOptions.None;
  36. private GlobalConfig globalConfig;
  37. [MenuItem("ET/Build Tool")]
  38. public static void ShowWindow()
  39. {
  40. GetWindow<BuildEditor>(DockDefine.Types);
  41. }
  42. private void OnEnable()
  43. {
  44. globalConfig = AssetDatabase.LoadAssetAtPath<GlobalConfig>("Assets/Resources/GlobalConfig.asset");
  45. #if UNITY_ANDROID
  46. activePlatform = PlatformType.Android;
  47. #elif UNITY_IOS
  48. activePlatform = PlatformType.IOS;
  49. #elif UNITY_STANDALONE_WIN
  50. activePlatform = PlatformType.Windows;
  51. #elif UNITY_STANDALONE_OSX
  52. activePlatform = PlatformType.MacOS;
  53. #elif UNITY_STANDALONE_LINUX
  54. activePlatform = PlatformType.Linux;
  55. #else
  56. activePlatform = PlatformType.None;
  57. #endif
  58. platformType = activePlatform;
  59. }
  60. private void OnGUI()
  61. {
  62. this.platformType = (PlatformType)EditorGUILayout.EnumPopup(platformType);
  63. this.clearFolder = EditorGUILayout.Toggle("clean folder? ", clearFolder);
  64. this.isBuildExe = EditorGUILayout.Toggle("build exe?", this.isBuildExe);
  65. this.isContainAB = EditorGUILayout.Toggle("contain assetsbundle?", this.isContainAB);
  66. this.codeOptimization = (CodeOptimization)EditorGUILayout.EnumPopup("CodeOptimization ", this.codeOptimization);
  67. EditorGUILayout.LabelField("BuildAssetBundleOptions ");
  68. this.buildAssetBundleOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumFlagsField(this.buildAssetBundleOptions);
  69. switch (this.codeOptimization)
  70. {
  71. case CodeOptimization.None:
  72. case CodeOptimization.Debug:
  73. this.buildOptions = BuildOptions.Development | BuildOptions.ConnectWithProfiler;
  74. break;
  75. case CodeOptimization.Release:
  76. this.buildOptions = BuildOptions.None;
  77. break;
  78. }
  79. GUILayout.Space(5);
  80. if (GUILayout.Button("BuildPackage"))
  81. {
  82. if (this.platformType == PlatformType.None)
  83. {
  84. ShowNotification(new GUIContent("please select platform!"));
  85. return;
  86. }
  87. if (platformType != activePlatform)
  88. {
  89. switch (EditorUtility.DisplayDialogComplex("Warning!", $"current platform is {activePlatform}, if change to {platformType}, may be take a long time", "change", "cancel", "no change"))
  90. {
  91. case 0:
  92. activePlatform = platformType;
  93. break;
  94. case 1:
  95. return;
  96. case 2:
  97. platformType = activePlatform;
  98. break;
  99. }
  100. }
  101. BuildHelper.Build(this.platformType, this.buildAssetBundleOptions, this.buildOptions, this.isBuildExe, this.isContainAB, this.clearFolder);
  102. }
  103. GUILayout.Label("");
  104. GUILayout.Label("Code Compile:");
  105. EditorGUI.BeginChangeCheck();
  106. this.globalConfig.CodeMode = (CodeMode)EditorGUILayout.EnumPopup("CodeMode: ", this.globalConfig.CodeMode);
  107. if (EditorGUI.EndChangeCheck())
  108. {
  109. EditorUtility.SetDirty(this.globalConfig);
  110. AssetDatabase.SaveAssetIfDirty(this.globalConfig);
  111. AssetDatabase.Refresh();
  112. }
  113. if (GUILayout.Button("BuildModelAndHotfix"))
  114. {
  115. if (Define.EnableCodes)
  116. {
  117. throw new Exception("now in ENABLE_CODES mode, do not need Build!");
  118. }
  119. BuildAssembliesHelper.BuildModel(this.codeOptimization, globalConfig);
  120. BuildAssembliesHelper.BuildHotfix(this.codeOptimization, globalConfig);
  121. AfterCompiling();
  122. ShowNotification("Build Model And Hotfix Success!");
  123. }
  124. if (GUILayout.Button("BuildModel"))
  125. {
  126. if (Define.EnableCodes)
  127. {
  128. throw new Exception("now in ENABLE_CODES mode, do not need Build!");
  129. }
  130. BuildAssembliesHelper.BuildModel(this.codeOptimization, globalConfig);
  131. AfterCompiling();
  132. ShowNotification("Build Model Success!");
  133. }
  134. if (GUILayout.Button("BuildHotfix"))
  135. {
  136. if (Define.EnableCodes)
  137. {
  138. throw new Exception("now in ENABLE_CODES mode, do not need Build!");
  139. }
  140. BuildAssembliesHelper.BuildHotfix(this.codeOptimization, globalConfig);
  141. AfterCompiling();
  142. ShowNotification("Build Hotfix Success!");
  143. }
  144. if (GUILayout.Button("ExcelExporter"))
  145. {
  146. //Directory.Delete("Assets/Bundles/Config", true);
  147. ToolsEditor.ExcelExporter();
  148. // 设置ab包
  149. AssetImporter assetImporter = AssetImporter.GetAtPath($"Assets/Bundles/Config");
  150. assetImporter.assetBundleName = "Config.unity3d";
  151. AssetDatabase.SaveAssets();
  152. AssetDatabase.Refresh();
  153. }
  154. if (GUILayout.Button("Proto2CS"))
  155. {
  156. ToolsEditor.Proto2CS();
  157. }
  158. GUILayout.Space(5);
  159. }
  160. private static void AfterCompiling()
  161. {
  162. Directory.CreateDirectory(BuildAssembliesHelper.CodeDir);
  163. // 设置ab包
  164. AssetImporter assetImporter = AssetImporter.GetAtPath("Assets/Bundles/Code");
  165. assetImporter.assetBundleName = "Code.unity3d";
  166. AssetDatabase.SaveAssets();
  167. AssetDatabase.Refresh();
  168. Debug.Log("build success!");
  169. }
  170. public static void ShowNotification(string tips)
  171. {
  172. EditorWindow game = EditorWindow.GetWindow(typeof(EditorWindow).Assembly.GetType("UnityEditor.GameView"));
  173. game?.ShowNotification(new GUIContent($"{tips}"));
  174. }
  175. }
  176. }