123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- #if UNITY_2019_4_OR_NEWER
- using System;
- using System.Linq;
- using System.Collections.Generic;
- using UnityEditor;
- using UnityEngine;
- using UnityEditor.UIElements;
- using UnityEngine.UIElements;
- using GFGEditor;
- namespace YooAsset.Editor
- {
- public class AssetBundleBuilderWindow : EditorWindow
- {
- [MenuItem("YooAsset/AssetBundle Builder", false, 102)]
- public static void OpenWindow()
- {
- AssetBundleBuilderWindow window = GetWindow<AssetBundleBuilderWindow>("资源包构建工具", true, WindowsDefine.DockedWindowTypes);
- window.minSize = new Vector2(800, 600);
- }
- private BuildTarget _buildTarget;
- private List<Type> _encryptionServicesClassTypes;
- private List<string> _encryptionServicesClassNames;
- private List<string> _buildPackageNames;
- private Button _saveButton;
- private TextField _buildOutputField;
- private EnumField _buildPipelineField;
- private EnumField _buildModeField;
- private TextField _buildVersionField;
- private PopupField<string> _buildPackageField;
- private PopupField<string> _encryptionField;
- private EnumField _compressionField;
- private EnumField _outputNameStyleField;
- private EnumField _copyBuildinFileOptionField;
- private TextField _copyBuildinFileTagsField;
- public void CreateGUI()
- {
- try
- {
- VisualElement root = this.rootVisualElement;
- // 加载布局文件
- var visualAsset = UxmlLoader.LoadWindowUXML<AssetBundleBuilderWindow>();
- if (visualAsset == null)
- return;
- visualAsset.CloneTree(root);
- // 配置保存按钮
- _saveButton = root.Q<Button>("SaveButton");
- _saveButton.clicked += SaveBtn_clicked;
- // 构建平台
- _buildTarget = EditorUserBuildSettings.activeBuildTarget;
- // 包裹名称列表
- _buildPackageNames = GetBuildPackageNames();
- // 加密服务类
- _encryptionServicesClassTypes = GetEncryptionServicesClassTypes();
- _encryptionServicesClassNames = _encryptionServicesClassTypes.Select(t => t.Name).ToList();
- // 输出目录
- string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
- _buildOutputField = root.Q<TextField>("BuildOutput");
- _buildOutputField.SetValueWithoutNotify(defaultOutputRoot);
- _buildOutputField.SetEnabled(false);
- // 构建管线
- _buildPipelineField = root.Q<EnumField>("BuildPipeline");
- _buildPipelineField.Init(AssetBundleBuilderSettingData.Setting.BuildPipeline);
- _buildPipelineField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.BuildPipeline);
- _buildPipelineField.style.width = 350;
- _buildPipelineField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.BuildPipeline = (EBuildPipeline)_buildPipelineField.value;
- RefreshWindow();
- });
- // 构建模式
- _buildModeField = root.Q<EnumField>("BuildMode");
- _buildModeField.Init(AssetBundleBuilderSettingData.Setting.BuildMode);
- _buildModeField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.BuildMode);
- _buildModeField.style.width = 350;
- _buildModeField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.BuildMode = (EBuildMode)_buildModeField.value;
- RefreshWindow();
- });
- // 构建版本
- _buildVersionField = root.Q<TextField>("BuildVersion");
- _buildVersionField.SetValueWithoutNotify(GetBuildPackageVersion());
- // 构建包裹
- var buildPackageContainer = root.Q("BuildPackageContainer");
- if (_buildPackageNames.Count > 0)
- {
- int defaultIndex = GetDefaultPackageIndex(AssetBundleBuilderSettingData.Setting.BuildPackage);
- _buildPackageField = new PopupField<string>(_buildPackageNames, defaultIndex);
- _buildPackageField.label = "Build Package";
- _buildPackageField.style.width = 350;
- _buildPackageField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.BuildPackage = _buildPackageField.value;
- });
- buildPackageContainer.Add(_buildPackageField);
- }
- else
- {
- _buildPackageField = new PopupField<string>();
- _buildPackageField.label = "Build Package";
- _buildPackageField.style.width = 350;
- buildPackageContainer.Add(_buildPackageField);
- }
- // 加密方法
- var encryptionContainer = root.Q("EncryptionContainer");
- if (_encryptionServicesClassNames.Count > 0)
- {
- int defaultIndex = GetDefaultEncryptionIndex(AssetBundleBuilderSettingData.Setting.EncyptionClassName);
- _encryptionField = new PopupField<string>(_encryptionServicesClassNames, defaultIndex);
- _encryptionField.label = "Encryption";
- _encryptionField.style.width = 350;
- _encryptionField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.EncyptionClassName = _encryptionField.value;
- });
- encryptionContainer.Add(_encryptionField);
- }
- else
- {
- _encryptionField = new PopupField<string>();
- _encryptionField.label = "Encryption";
- _encryptionField.style.width = 350;
- encryptionContainer.Add(_encryptionField);
- }
- // 压缩方式选项
- _compressionField = root.Q<EnumField>("Compression");
- _compressionField.Init(AssetBundleBuilderSettingData.Setting.CompressOption);
- _compressionField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.CompressOption);
- _compressionField.style.width = 350;
- _compressionField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.CompressOption = (ECompressOption)_compressionField.value;
- });
- // 输出文件名称样式
- _outputNameStyleField = root.Q<EnumField>("OutputNameStyle");
- _outputNameStyleField.Init(AssetBundleBuilderSettingData.Setting.OutputNameStyle);
- _outputNameStyleField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.OutputNameStyle);
- _outputNameStyleField.style.width = 350;
- _outputNameStyleField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.OutputNameStyle = (EOutputNameStyle)_outputNameStyleField.value;
- });
- // 首包文件拷贝选项
- _copyBuildinFileOptionField = root.Q<EnumField>("CopyBuildinFileOption");
- _copyBuildinFileOptionField.Init(AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption);
- _copyBuildinFileOptionField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption);
- _copyBuildinFileOptionField.style.width = 350;
- _copyBuildinFileOptionField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption = (ECopyBuildinFileOption)_copyBuildinFileOptionField.value;
- RefreshWindow();
- });
- // 首包文件的资源标签
- _copyBuildinFileTagsField = root.Q<TextField>("CopyBuildinFileTags");
- _copyBuildinFileTagsField.SetValueWithoutNotify(AssetBundleBuilderSettingData.Setting.CopyBuildinFileTags);
- _copyBuildinFileTagsField.RegisterValueChangedCallback(evt =>
- {
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.CopyBuildinFileTags = _copyBuildinFileTagsField.value;
- });
- // 构建按钮
- var buildButton = root.Q<Button>("Build");
- buildButton.clicked += BuildButton_clicked; ;
- RefreshWindow();
- }
- catch (Exception e)
- {
- Debug.LogError(e.ToString());
- }
- }
- public void OnDestroy()
- {
- if (AssetBundleBuilderSettingData.IsDirty)
- AssetBundleBuilderSettingData.SaveFile();
- }
- public void Update()
- {
- if (_saveButton != null)
- {
- if (AssetBundleBuilderSettingData.IsDirty)
- {
- if (_saveButton.enabledSelf == false)
- _saveButton.SetEnabled(true);
- }
- else
- {
- if (_saveButton.enabledSelf)
- _saveButton.SetEnabled(false);
- }
- }
- }
- private void RefreshWindow()
- {
- var buildPipeline = AssetBundleBuilderSettingData.Setting.BuildPipeline;
- var buildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
- var copyOption = AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption;
- bool enableElement = buildMode == EBuildMode.ForceRebuild;
- bool tagsFiledVisible = copyOption == ECopyBuildinFileOption.ClearAndCopyByTags || copyOption == ECopyBuildinFileOption.OnlyCopyByTags;
- if (buildPipeline == EBuildPipeline.BuiltinBuildPipeline)
- {
- _compressionField.SetEnabled(enableElement);
- _outputNameStyleField.SetEnabled(enableElement);
- _copyBuildinFileOptionField.SetEnabled(enableElement);
- _copyBuildinFileTagsField.SetEnabled(enableElement);
- }
- else
- {
- _compressionField.SetEnabled(true);
- _outputNameStyleField.SetEnabled(true);
- _copyBuildinFileOptionField.SetEnabled(true);
- _copyBuildinFileTagsField.SetEnabled(true);
- }
- _copyBuildinFileTagsField.visible = tagsFiledVisible;
- }
- private void SaveBtn_clicked()
- {
- AssetBundleBuilderSettingData.SaveFile();
- }
- private void BuildButton_clicked()
- {
- var buildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
- if (EditorUtility.DisplayDialog("提示", $"通过构建模式【{buildMode}】来构建!", "Yes", "No"))
- {
- EditorTools.ClearUnityConsole();
- EditorApplication.delayCall += ExecuteBuild;
- }
- else
- {
- Debug.LogWarning("[Build] 打包已经取消");
- }
- }
- /// <summary>
- /// 执行构建
- /// </summary>
- private void ExecuteBuild()
- {
- AssetBundleHelper.OnPreExecuteBuild();
- BuildParameters buildParameters = new BuildParameters();
- buildParameters.StreamingAssetsRoot = AssetBundleBuilderHelper.GetDefaultStreamingAssetsRoot();
- buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
- buildParameters.BuildTarget = _buildTarget;
- buildParameters.BuildPipeline = AssetBundleBuilderSettingData.Setting.BuildPipeline;
- buildParameters.BuildMode = AssetBundleBuilderSettingData.Setting.BuildMode;
- buildParameters.PackageName = AssetBundleBuilderSettingData.Setting.BuildPackage;
- buildParameters.PackageVersion = _buildVersionField.value;
- buildParameters.VerifyBuildingResult = true;
- buildParameters.SharedPackRule = new ZeroRedundancySharedPackRule();
- buildParameters.EncryptionServices = CreateEncryptionServicesInstance();
- buildParameters.CompressOption = AssetBundleBuilderSettingData.Setting.CompressOption;
- buildParameters.OutputNameStyle = AssetBundleBuilderSettingData.Setting.OutputNameStyle;
- buildParameters.CopyBuildinFileOption = AssetBundleBuilderSettingData.Setting.CopyBuildinFileOption;
- buildParameters.CopyBuildinFileTags = AssetBundleBuilderSettingData.Setting.CopyBuildinFileTags;
- if (AssetBundleBuilderSettingData.Setting.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
- {
- buildParameters.SBPParameters = new BuildParameters.SBPBuildParameters();
- buildParameters.SBPParameters.WriteLinkXML = true;
- }
- var builder = new AssetBundleBuilder();
- var buildResult = builder.Run(buildParameters);
- if (buildResult.Success)
- {
- EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
- }
- AssetBundleHelper.OnPostExecuteBuild(buildResult);
- }
- // 构建版本相关
- private string GetBuildPackageVersion()
- {
- return DateTime.Now.ToString("yyMMddHHmm");
- }
- // 构建包裹相关
- private int GetDefaultPackageIndex(string packageName)
- {
- for (int index = 0; index < _buildPackageNames.Count; index++)
- {
- if (_buildPackageNames[index] == packageName)
- {
- return index;
- }
- }
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.BuildPackage = _buildPackageNames[0];
- return 0;
- }
- private List<string> GetBuildPackageNames()
- {
- List<string> result = new List<string>();
- foreach (var package in AssetBundleCollectorSettingData.Setting.Packages)
- {
- result.Add(package.PackageName);
- }
- return result;
- }
- // 加密类相关
- private int GetDefaultEncryptionIndex(string className)
- {
- for (int index = 0; index < _encryptionServicesClassNames.Count; index++)
- {
- if (_encryptionServicesClassNames[index] == className)
- {
- return index;
- }
- }
- AssetBundleBuilderSettingData.IsDirty = true;
- AssetBundleBuilderSettingData.Setting.EncyptionClassName = _encryptionServicesClassNames[0];
- return 0;
- }
- private List<Type> GetEncryptionServicesClassTypes()
- {
- return EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
- }
- private IEncryptionServices CreateEncryptionServicesInstance()
- {
- if (_encryptionField.index < 0)
- return null;
- var classType = _encryptionServicesClassTypes[_encryptionField.index];
- return (IEncryptionServices)Activator.CreateInstance(classType);
- }
- }
- }
- #endif
|