#if UNITY_2019_4_OR_NEWER using System; using System.IO; using System.Linq; using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEditor.UIElements; using UnityEngine.UIElements; namespace YooAsset.Editor { internal abstract class BuildPipelineViewerBase { private const int StyleWidth = 400; private const int LabelMinWidth = 180; protected readonly string PackageName; protected readonly BuildTarget BuildTarget; protected readonly EBuildPipeline BuildPipeline; protected TemplateContainer Root; private TextField _buildOutputField; private TextField _buildVersionField; private PopupField _buildModeField; private PopupField _encryptionField; private EnumField _compressionField; private EnumField _outputNameStyleField; private EnumField _copyBuildinFileOptionField; private TextField _copyBuildinFileTagsField; private Toggle _clearBuildCacheToggle; private Toggle _useAssetDependencyDBToggle; public BuildPipelineViewerBase(string packageName, EBuildPipeline buildPipeline, BuildTarget buildTarget, VisualElement parent) { PackageName = packageName; BuildTarget = buildTarget; BuildPipeline = buildPipeline; CreateView(parent); RefreshView(); } private void CreateView(VisualElement parent) { // 加载布局文件 var visualAsset = UxmlLoader.LoadWindowUXML(); if (visualAsset == null) return; Root = visualAsset.CloneTree(); Root.style.flexGrow = 1f; parent.Add(Root); // 输出目录 string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(); _buildOutputField = Root.Q("BuildOutput"); _buildOutputField.SetValueWithoutNotify(defaultOutputRoot); _buildOutputField.SetEnabled(false); // 构建版本 _buildVersionField = Root.Q("BuildVersion"); _buildVersionField.style.width = StyleWidth; _buildVersionField.SetValueWithoutNotify(GetDefaultPackageVersion()); // 加密方法 { var encryptionContainer = Root.Q("EncryptionContainer"); var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices)); if (encryptionClassTypes.Count > 0) { var encyptionClassName = AssetBundleBuilderSetting.GetPackageEncyptionClassName(PackageName, BuildPipeline); int defaultIndex = encryptionClassTypes.FindIndex(x => x.FullName.Equals(encyptionClassName)); if (defaultIndex < 0) defaultIndex = 0; _encryptionField = new PopupField(encryptionClassTypes, defaultIndex); _encryptionField.label = "Encryption"; _encryptionField.style.width = StyleWidth; _encryptionField.RegisterValueChangedCallback(evt => { AssetBundleBuilderSetting.SetPackageEncyptionClassName(PackageName, BuildPipeline, _encryptionField.value.FullName); }); encryptionContainer.Add(_encryptionField); } else { _encryptionField = new PopupField(); _encryptionField.label = "Encryption"; _encryptionField.style.width = StyleWidth; encryptionContainer.Add(_encryptionField); } } // 压缩方式选项 var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(PackageName, BuildPipeline); _compressionField = Root.Q("Compression"); _compressionField.Init(compressOption); _compressionField.SetValueWithoutNotify(compressOption); _compressionField.style.width = StyleWidth; _compressionField.RegisterValueChangedCallback(evt => { AssetBundleBuilderSetting.SetPackageCompressOption(PackageName, BuildPipeline, (ECompressOption)_compressionField.value); }); // 输出文件名称样式 var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(PackageName, BuildPipeline); _outputNameStyleField = Root.Q("FileNameStyle"); _outputNameStyleField.Init(fileNameStyle); _outputNameStyleField.SetValueWithoutNotify(fileNameStyle); _outputNameStyleField.style.width = StyleWidth; _outputNameStyleField.RegisterValueChangedCallback(evt => { AssetBundleBuilderSetting.SetPackageFileNameStyle(PackageName, BuildPipeline, (EFileNameStyle)_outputNameStyleField.value); }); // 首包文件拷贝选项 var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(PackageName, BuildPipeline); _copyBuildinFileOptionField = Root.Q("CopyBuildinFileOption"); _copyBuildinFileOptionField.Init(buildinFileCopyOption); _copyBuildinFileOptionField.SetValueWithoutNotify(buildinFileCopyOption); _copyBuildinFileOptionField.style.width = StyleWidth; _copyBuildinFileOptionField.RegisterValueChangedCallback(evt => { AssetBundleBuilderSetting.SetPackageBuildinFileCopyOption(PackageName, BuildPipeline, (EBuildinFileCopyOption)_copyBuildinFileOptionField.value); RefreshView(); }); // 首包文件拷贝参数 var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(PackageName, BuildPipeline); _copyBuildinFileTagsField = Root.Q("CopyBuildinFileParam"); _copyBuildinFileTagsField.SetValueWithoutNotify(buildinFileCopyParams); _copyBuildinFileTagsField.RegisterValueChangedCallback(evt => { AssetBundleBuilderSetting.SetPackageBuildinFileCopyParams(PackageName, BuildPipeline, _copyBuildinFileTagsField.value); }); // 清理构建缓存 bool clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(PackageName, BuildPipeline); _clearBuildCacheToggle = Root.Q("ClearBuildCache"); _clearBuildCacheToggle.SetValueWithoutNotify(clearBuildCache); _clearBuildCacheToggle.RegisterValueChangedCallback(evt => { AssetBundleBuilderSetting.SetPackageClearBuildCache(PackageName, BuildPipeline, _clearBuildCacheToggle.value); }); // 使用资源依赖数据库 bool useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(PackageName, BuildPipeline); _useAssetDependencyDBToggle = Root.Q("UseAssetDependency"); _useAssetDependencyDBToggle.SetValueWithoutNotify(useAssetDependencyDB); _useAssetDependencyDBToggle.RegisterValueChangedCallback(evt => { AssetBundleBuilderSetting.SetPackageUseAssetDependencyDB(PackageName, BuildPipeline, _useAssetDependencyDBToggle.value); }); // 对齐文本间距 UIElementsTools.SetElementLabelMinWidth(_buildOutputField, LabelMinWidth); UIElementsTools.SetElementLabelMinWidth(_buildVersionField, LabelMinWidth); UIElementsTools.SetElementLabelMinWidth(_compressionField, LabelMinWidth); UIElementsTools.SetElementLabelMinWidth(_encryptionField, LabelMinWidth); UIElementsTools.SetElementLabelMinWidth(_outputNameStyleField, LabelMinWidth); UIElementsTools.SetElementLabelMinWidth(_copyBuildinFileOptionField, LabelMinWidth); UIElementsTools.SetElementLabelMinWidth(_copyBuildinFileTagsField, LabelMinWidth); UIElementsTools.SetElementLabelMinWidth(_clearBuildCacheToggle, LabelMinWidth); UIElementsTools.SetElementLabelMinWidth(_useAssetDependencyDBToggle, LabelMinWidth); // 构建按钮 var buildButton = Root.Q