BuildMenu.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. // Magica Cloth.
  2. // Copyright (c) MagicaSoft, 2020-2022.
  3. // https://magicasoft.jp
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using UnityEditor;
  7. using UnityEngine;
  8. namespace MagicaCloth
  9. {
  10. /// <summary>
  11. /// ビルドメニューウインドウ
  12. /// </summary>
  13. public class BuildMenu : EditorWindow
  14. {
  15. [SerializeField]
  16. BuildMenuData settingData = new BuildMenuData();
  17. //=========================================================================================
  18. [MenuItem("Tools/Magica Cloth/Build Menu", false)]
  19. public static void InitWindow()
  20. {
  21. OpenBuildMenu();
  22. }
  23. public static void OpenBuildMenu()
  24. {
  25. // 全体で1つのみ起動を許可する
  26. var settingMenu = EditorWindow.GetWindow<BuildMenu>(true, "Magica Cloth Build Menu", true);
  27. if (settingMenu != null)
  28. {
  29. settingMenu.Init();
  30. }
  31. }
  32. //=========================================================================================
  33. public void Init()
  34. {
  35. // サイズ変更不可
  36. maxSize = minSize = new Vector2(350, 520);
  37. // 設定データ
  38. settingData.Load();
  39. // 現在アセットが選択中ならば対象を選択に変更する
  40. //settingData.targetMode = Selection.activeObject ? 1 : 0;
  41. }
  42. void OnDestroy()
  43. {
  44. //Debug.Log("BuildMenu.OnDestroy()");
  45. // 念の為
  46. EditorUtility.ClearProgressBar();
  47. }
  48. void OnGUI()
  49. {
  50. if (settingData == null)
  51. return;
  52. GUILayout.Space(10);
  53. GeneralGUI();
  54. GUILayout.Space(10);
  55. using (var horizontalScope = new GUILayout.HorizontalScope())
  56. {
  57. GUILayout.FlexibleSpace();
  58. if (GUILayout.Button(settingData.VerificationOnly ? "Verify" : "Build", GUILayout.Width(80)))
  59. {
  60. Save();
  61. Confirm();
  62. }
  63. GUILayout.Space(20);
  64. if (GUILayout.Button("Close", GUILayout.Width(80)))
  65. {
  66. Save();
  67. Close();
  68. }
  69. GUILayout.FlexibleSpace();
  70. }
  71. GUILayout.Space(10);
  72. }
  73. //=========================================================================================
  74. void GeneralGUI()
  75. {
  76. EditorGUIUtility.labelWidth = 200;
  77. // Target Object
  78. EditorGUILayout.LabelField("Target Object", EditorStyles.boldLabel);
  79. using (var verticalScope = new GUILayout.VerticalScope(GUI.skin.box))
  80. {
  81. settingData.TargetMode = GUILayout.SelectionGrid(settingData.TargetMode, new string[] { "All Assets", "Selected Assets" }, 1, new GUIStyle(EditorStyles.radioButton));
  82. settingData.Prefab = EditorGUILayout.Toggle("Prefab", settingData.Prefab);
  83. settingData.Scene = EditorGUILayout.Toggle("Scene", settingData.Scene);
  84. }
  85. GUILayout.Space(10);
  86. // Target Component
  87. EditorGUILayout.LabelField("Target Component", EditorStyles.boldLabel);
  88. using (var verticalScope = new GUILayout.VerticalScope(GUI.skin.box))
  89. {
  90. settingData.BoneCloth = EditorGUILayout.Toggle("Bone Cloth", settingData.BoneCloth);
  91. settingData.BoneSpring = EditorGUILayout.Toggle("Bone Spring", settingData.BoneSpring);
  92. settingData.MeshCloth = EditorGUILayout.Toggle("Mesh Cloth", settingData.MeshCloth);
  93. settingData.MeshSpring = EditorGUILayout.Toggle("Mesh Spring", settingData.MeshSpring);
  94. settingData.RenderDeformer = EditorGUILayout.Toggle("Render Deformer", settingData.RenderDeformer);
  95. settingData.VirtualDeformer = EditorGUILayout.Toggle("Virtual Deformer", settingData.VirtualDeformer);
  96. }
  97. GUILayout.Space(10);
  98. // Build Conditions
  99. EditorGUILayout.LabelField("Build Conditions", EditorStyles.boldLabel);
  100. using (var verticalScope = new GUILayout.VerticalScope(GUI.skin.box))
  101. {
  102. using (var disableScope = new EditorGUI.DisabledGroupScope(settingData.VerificationOnly))
  103. {
  104. settingData.ForceBuild = EditorGUILayout.Toggle("Force Build", settingData.ForceBuild);
  105. settingData.NotCreated = EditorGUILayout.Toggle("Not Created Or In Error", settingData.NotCreated);
  106. settingData.UpgradeFormatAndAlgorithm = EditorGUILayout.Toggle("Upgrade Format And Algorithm", settingData.UpgradeFormatAndAlgorithm);
  107. }
  108. settingData.VerificationOnly = EditorGUILayout.Toggle("Verification Only (no build)", settingData.VerificationOnly);
  109. }
  110. GUILayout.Space(10);
  111. // Option
  112. EditorGUILayout.LabelField("Option", EditorStyles.boldLabel);
  113. using (var verticalScope = new GUILayout.VerticalScope(GUI.skin.box))
  114. {
  115. settingData.ErrorStop = EditorGUILayout.Toggle("Error Stop", settingData.ErrorStop);
  116. }
  117. GUILayout.FlexibleSpace();
  118. }
  119. /// <summary>
  120. /// 設定保存
  121. /// </summary>
  122. void Save()
  123. {
  124. settingData.Save();
  125. }
  126. //=========================================================================================
  127. /// <summary>
  128. /// 実行確認
  129. /// </summary>
  130. void Confirm()
  131. {
  132. // 対象guids
  133. var guidList = new List<string>();
  134. if (settingData.TargetMode == 0)
  135. {
  136. // All Assets
  137. if (settingData.Prefab)
  138. guidList.AddRange(AssetDatabase.FindAssets("t:Prefab", new[] { "Assets" }));
  139. if (settingData.Scene)
  140. guidList.AddRange(AssetDatabase.FindAssets("t:Scene", new[] { "Assets" }));
  141. }
  142. else if (settingData.TargetMode == 1)
  143. {
  144. // Selected
  145. foreach (var guid in Selection.assetGUIDs)
  146. {
  147. var path = AssetDatabase.GUIDToAssetPath(guid);
  148. if (path.StartsWith("Assets"))
  149. {
  150. if (settingData.Prefab && Path.GetExtension(path) == ".prefab")
  151. guidList.Add(guid);
  152. if (settingData.Scene && Path.GetExtension(path) == ".unity")
  153. guidList.Add(guid);
  154. }
  155. }
  156. }
  157. // 実行確認
  158. if (guidList.Count == 0)
  159. {
  160. EditorUtility.DisplayDialog("Confirm", "Not applicable!", "OK");
  161. }
  162. else
  163. {
  164. if (EditorUtility.DisplayDialog("Confirm", $"Select [{guidList.Count}] Assets.\nDo you want to run it?\n\n<< Attention! >>\nThis operation cannot be undone.", "OK", "Cancel"))
  165. {
  166. Build(guidList);
  167. GUIUtility.ExitGUI();
  168. }
  169. }
  170. }
  171. /// <summary>
  172. /// ビルド開始
  173. /// </summary>
  174. void Build(List<string> guidList)
  175. {
  176. Debug.Log("Start Build.");
  177. // option
  178. var option = new BuildOptions()
  179. {
  180. includeInactive = true,
  181. buildBoneCloth = settingData.BoneCloth,
  182. buildBoneSpring = settingData.BoneSpring,
  183. buildMeshCloth = settingData.MeshCloth,
  184. buildMeshSpring = settingData.MeshSpring,
  185. buildRenderDeformer = settingData.RenderDeformer,
  186. buildVirtualDeformer = settingData.VirtualDeformer,
  187. forceBuild = settingData.ForceBuild,
  188. notCreated = settingData.NotCreated,
  189. upgradeFormatAndAlgorithm = settingData.UpgradeFormatAndAlgorithm,
  190. verificationOnly = settingData.VerificationOnly,
  191. errorStop = settingData.ErrorStop,
  192. };
  193. int cnt = guidList.Count;
  194. var totalResult = new BuildResult();
  195. for (int i = 0; i < cnt; i++)
  196. {
  197. // progress bar
  198. float progress = (float)i / cnt;
  199. bool isCancel = EditorUtility.DisplayCancelableProgressBar("Build", $"{i} / {cnt}", progress);
  200. if (isCancel)
  201. {
  202. Debug.Log("Cancel Build!");
  203. break;
  204. }
  205. var path = AssetDatabase.GUIDToAssetPath(guidList[i]);
  206. var result = new BuildResult();
  207. if (Path.GetExtension(path) == ".prefab")
  208. {
  209. result = BuildManager.BuildFromAssetPath(path, option);
  210. }
  211. if (Path.GetExtension(path) == ".unity")
  212. {
  213. result = BuildManager.BuildFromScenePath(path, option);
  214. }
  215. // total
  216. totalResult.Merge(result);
  217. if (result.IsError())
  218. {
  219. Debug.LogError($"<color=red>Failed!</color> [{path}]\n{result.GetErrorMessage()}");
  220. if (option.errorStop)
  221. {
  222. Debug.Log("Error Stop!");
  223. break;
  224. }
  225. }
  226. }
  227. EditorUtility.ClearProgressBar();
  228. Debug.Log($"End Build. (<color=#BFFF00>Success</color>={totalResult.SuccessCount}, <color=red>Failed</color>={totalResult.FailedCount})");
  229. }
  230. }
  231. }