BuildPipelineViewerBase.cs 10 KB

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