BuildPipelineViewerBase.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #if UNITY_2019_4_OR_NEWER
  2. using System;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Collections.Generic;
  6. using UnityEditor;
  7. using UnityEngine;
  8. using UnityEditor.UIElements;
  9. using UnityEngine.UIElements;
  10. namespace YooAsset.Editor
  11. {
  12. internal abstract class BuildPipelineViewerBase
  13. {
  14. private const int StyleWidth = 400;
  15. protected readonly string PackageName;
  16. protected readonly BuildTarget BuildTarget;
  17. protected readonly EBuildPipeline BuildPipeline;
  18. protected TemplateContainer Root;
  19. private TextField _buildOutputField;
  20. private TextField _buildVersionField;
  21. private PopupField<Enum> _buildModeField;
  22. private PopupField<Type> _encryptionField;
  23. private EnumField _compressionField;
  24. private EnumField _outputNameStyleField;
  25. private EnumField _copyBuildinFileOptionField;
  26. private TextField _copyBuildinFileTagsField;
  27. public BuildPipelineViewerBase(string packageName, EBuildPipeline buildPipeline, BuildTarget buildTarget, VisualElement parent)
  28. {
  29. PackageName = packageName;
  30. BuildTarget = buildTarget;
  31. BuildPipeline = buildPipeline;
  32. CreateView(parent);
  33. RefreshView();
  34. }
  35. private void CreateView(VisualElement parent)
  36. {
  37. // 加载布局文件
  38. var visualAsset = UxmlLoader.LoadWindowUXML<BuildPipelineViewerBase>();
  39. if (visualAsset == null)
  40. return;
  41. Root = visualAsset.CloneTree();
  42. Root.style.flexGrow = 1f;
  43. parent.Add(Root);
  44. // 输出目录
  45. string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
  46. _buildOutputField = Root.Q<TextField>("BuildOutput");
  47. _buildOutputField.SetValueWithoutNotify(defaultOutputRoot);
  48. _buildOutputField.SetEnabled(false);
  49. // 构建版本
  50. _buildVersionField = Root.Q<TextField>("BuildVersion");
  51. _buildVersionField.style.width = StyleWidth;
  52. _buildVersionField.SetValueWithoutNotify(GetDefaultPackageVersion());
  53. // 构建模式
  54. {
  55. var buildModeContainer = Root.Q("BuildModeContainer");
  56. var buildMode = AssetBundleBuilderSetting.GetPackageBuildMode(PackageName, BuildPipeline);
  57. var buildModeList = GetSupportBuildModes();
  58. int defaultIndex = buildModeList.FindIndex(x => x.Equals(buildMode));
  59. if (defaultIndex < 0)
  60. defaultIndex = (int)(EBuildMode)buildModeList[0];
  61. _buildModeField = new PopupField<Enum>(buildModeList, defaultIndex);
  62. _buildModeField.label = "Build Mode";
  63. _buildModeField.style.width = StyleWidth;
  64. _buildModeField.RegisterValueChangedCallback(evt =>
  65. {
  66. AssetBundleBuilderSetting.SetPackageBuildMode(PackageName, BuildPipeline, (EBuildMode)_buildModeField.value);
  67. });
  68. buildModeContainer.Add(_buildModeField);
  69. }
  70. // 加密方法
  71. {
  72. var encryptionContainer = Root.Q("EncryptionContainer");
  73. var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
  74. if (encryptionClassTypes.Count > 0)
  75. {
  76. var encyptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(PackageName, BuildPipeline);
  77. int defaultIndex = encryptionClassTypes.FindIndex(x => x.FullName.Equals(encyptionClassName));
  78. if (defaultIndex < 0)
  79. defaultIndex = 0;
  80. _encryptionField = new PopupField<Type>(encryptionClassTypes, defaultIndex);
  81. _encryptionField.label = "Encryption";
  82. _encryptionField.style.width = StyleWidth;
  83. _encryptionField.RegisterValueChangedCallback(evt =>
  84. {
  85. AssetBundleBuilderSetting.SetPackageEncyptionClassName(PackageName, BuildPipeline, _encryptionField.value.FullName);
  86. });
  87. encryptionContainer.Add(_encryptionField);
  88. }
  89. else
  90. {
  91. _encryptionField = new PopupField<Type>();
  92. _encryptionField.label = "Encryption";
  93. _encryptionField.style.width = StyleWidth;
  94. encryptionContainer.Add(_encryptionField);
  95. }
  96. }
  97. // 压缩方式选项
  98. var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline);
  99. _compressionField = Root.Q<EnumField>("Compression");
  100. _compressionField.Init(compressOption);
  101. _compressionField.SetValueWithoutNotify(compressOption);
  102. _compressionField.style.width = StyleWidth;
  103. _compressionField.RegisterValueChangedCallback(evt =>
  104. {
  105. AssetBundleBuilderSetting.SetPackageCompressOption(PackageName, BuildPipeline, (ECompressOption)_compressionField.value);
  106. });
  107. // 输出文件名称样式
  108. var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, BuildPipeline);
  109. _outputNameStyleField = Root.Q<EnumField>("FileNameStyle");
  110. _outputNameStyleField.Init(fileNameStyle);
  111. _outputNameStyleField.SetValueWithoutNotify(fileNameStyle);
  112. _outputNameStyleField.style.width = StyleWidth;
  113. _outputNameStyleField.RegisterValueChangedCallback(evt =>
  114. {
  115. AssetBundleBuilderSetting.SetPackageFileNameStyle(PackageName, BuildPipeline, (EFileNameStyle)_outputNameStyleField.value);
  116. });
  117. // 首包文件拷贝选项
  118. var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
  119. _copyBuildinFileOptionField = Root.Q<EnumField>("CopyBuildinFileOption");
  120. _copyBuildinFileOptionField.Init(buildinFileCopyOption);
  121. _copyBuildinFileOptionField.SetValueWithoutNotify(buildinFileCopyOption);
  122. _copyBuildinFileOptionField.style.width = StyleWidth;
  123. _copyBuildinFileOptionField.RegisterValueChangedCallback(evt =>
  124. {
  125. AssetBundleBuilderSetting.SetPackageBuildinFileCopyOption(PackageName, BuildPipeline, (EBuildinFileCopyOption)_copyBuildinFileOptionField.value);
  126. RefreshView();
  127. });
  128. // 首包文件拷贝参数
  129. var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline);
  130. _copyBuildinFileTagsField = Root.Q<TextField>("CopyBuildinFileParam");
  131. _copyBuildinFileTagsField.SetValueWithoutNotify(buildinFileCopyParams);
  132. _copyBuildinFileTagsField.RegisterValueChangedCallback(evt =>
  133. {
  134. AssetBundleBuilderSetting.SetPackageBuildinFileCopyParams(PackageName, BuildPipeline, _copyBuildinFileTagsField.value);
  135. });
  136. // 构建按钮
  137. var buildButton = Root.Q<Button>("Build");
  138. buildButton.clicked += BuildButton_clicked;
  139. }
  140. private void RefreshView()
  141. {
  142. var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline);
  143. bool tagsFiledVisible = buildinFileCopyOption == EBuildinFileCopyOption.ClearAndCopyByTags || buildinFileCopyOption == EBuildinFileCopyOption.OnlyCopyByTags;
  144. _copyBuildinFileTagsField.visible = tagsFiledVisible;
  145. }
  146. private void BuildButton_clicked()
  147. {
  148. var buildMode = AssetBundleBuilderSetting.GetPackageBuildMode(PackageName, BuildPipeline);
  149. if (EditorUtility.DisplayDialog("提示", $"通过构建模式【{buildMode}】来构建!", "Yes", "No"))
  150. {
  151. EditorTools.ClearUnityConsole();
  152. EditorApplication.delayCall += ExecuteBuild;
  153. }
  154. else
  155. {
  156. Debug.LogWarning("[Build] 打包已经取消");
  157. }
  158. }
  159. /// <summary>
  160. /// 执行构建任务
  161. /// </summary>
  162. protected abstract void ExecuteBuild();
  163. /// <summary>
  164. /// 获取构建管线支持的构建模式集合
  165. /// </summary>
  166. protected abstract List<Enum> GetSupportBuildModes();
  167. /// <summary>
  168. /// 获取构建版本
  169. /// </summary>
  170. protected string GetPackageVersion()
  171. {
  172. return _buildVersionField.value;
  173. }
  174. /// <summary>
  175. /// 创建加密类实例
  176. /// </summary>
  177. protected IEncryptionServices CreateEncryptionInstance()
  178. {
  179. var encyptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(PackageName, BuildPipeline);
  180. var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
  181. var classType = encryptionClassTypes.Find(x => x.FullName.Equals(encyptionClassName));
  182. if (classType != null)
  183. return (IEncryptionServices)Activator.CreateInstance(classType);
  184. else
  185. return null;
  186. }
  187. private string GetDefaultPackageVersion()
  188. {
  189. int totalMinutes = DateTime.Now.Hour * 60 + DateTime.Now.Minute;
  190. return DateTime.Now.ToString("yyyy-MM-dd") + "-" + totalMinutes;
  191. }
  192. }
  193. }
  194. #endif