Unity 自定义批量打包工具

打包配置项

using UnityEngine;
using System.Collections.Generic;

namespace MYTOOL.Build
{
   
    [System.Flags]
    public enum VersionOptions
    {
   
        None = 0,
        Major = 1,
        Minor = 4,
        Build = 8,
        Revision = 0x10,
    }

    /// <summary>
    /// 批量打包配置文件
    /// </summary>
    [CreateAssetMenu]
    public class BatchBuildProfile : ScriptableObject
    {
   
        public VersionOptions versionOptions = VersionOptions.Revision;
        public List<BuildTask> tasks = new List<BuildTask>(0);
    }
}

打包功能

using UnityEditor;
using UnityEngine;
using System;
using System.IO;
using System.Collections.Generic;

namespace MYTOOL.Build
{
   
    public class LogMessage
    {
   
        public LogType type;
        public string message;

        public LogMessage(LogType type, string message)
        {
   
            this.type = type;
            this.message = message;
        }
    }

    [CustomEditor(typeof(BatchBuildProfile))]
    public class BatchBuildProfileInspector : Editor
    {
   
        //配置文件
        private BatchBuildProfile profile;
        //折叠栏
        private Dictionary<BuildTask, bool> foldoutMap;
        //记录日志
        private List<LogMessage> logsList;

        private void OnEnable()
        {
   
            profile = target as BatchBuildProfile;
            foldoutMap = new Dictionary<BuildTask, bool>();
            logsList = new List<LogMessage>();
        }

        public override void OnInspectorGUI()
        {
   
            OnMenuGUI();
            OnListGUI();
            serializedObject.ApplyModifiedProperties();
            if (GUI.changed)
                EditorUtility.SetDirty(profile);
        }

        /// <summary>
        /// 菜单项
        /// </summary>
        private void OnMenuGUI()
        {
   
            EditorGUILayout.HelpBox($"已有打包工作项:{
     profile.tasks.Count}个", MessageType.Info);
            EditorGUILayout.HelpBox($"打包时会先进行排序, 优先打包当前平台【{
     EditorUserBuildSettings.activeBuildTarget}】", MessageType.Info);
            //限制20个
            if (profile.tasks.Count < 20)
            {
   
                //新建工作项
                if (GUILayout.Button("新建工作项", GUILayout.Height(30)))
                {
   
                    Undo.RecordObject(profile, "Create");
                    string buildPath = Path.Combine(Directory.GetParent(Application.dataPath).FullName, ".Build");
                    if (Directory.Exists(buildPath) == false)
                    {
   
                        Directory.CreateDirectory(buildPath);
                        Debug.LogFormat("创建构建目录:{0}", buildPath);
                    }

                    var task = new BuildTask(PlayerSettings.productName, (MyBuildTarget)EditorUserBuildSettings.activeBuildTarget, buildPath);
                    profile.tasks.Add(task);
                }
            }
            else
            {
   
                EditorGUILayout.HelpBox($"无法新建打包工作项", MessageType.Warning);
            }

            if (profile.tasks.Count > 0)
            {
   
                //清空
                GUI.color = Color.yellow;
                if (GUILayout.Button("清空工作项", GUILayout.Height(30)))
                {
   
                    Undo.RecordObject(profile, "Clear");
                    if (EditorUtility.DisplayDialog("提醒", "是否确认清理所有打包工作项?", "确定", "取消"))
                    {
   
                        Debug.LogWarningFormat("清理{0}个打包工作项", profile.tasks.Count);
                        profile.tasks.Clear();
                        foldoutMap.Clear();
                    }
                }

                //开始打包
                GUI.color = Color.cyan;
                if (GUILayout.Button("开始打包", GUILayout.Height(30)))
                {
   
                    if (EditorUtility.DisplayDialog("确认操作", "即将开始打包过程,这可能需要一些时间。您希望继续吗?", "继续", "取消"))
                    {
   
                        logsList.Clear();
                        OnBuild(false);
                    }
                    return;
                }

                //清理并打包
                GUI.color = Color.yellow;
                if (GUILayout.Button("清理并打包", GUILayout.Height(30)))
                {
   
                    if (EditorUtility.DisplayDialog("确认操作", "即将进行清理并开始打包过程,这可能需要一些时间。您希望继续吗?", "继续", "取消"))
                    {
   
                        if (EditorUtility.DisplayDialog("重要提醒", "清理操作将移除当前构建平台的所有文件,请确保已备份重要数据。是否要继续?此操作不可逆。", "确定继续", "取消"))
                        {
   
                            logsList.Clear();
                            OnBuild(true);
                        }
                    }
                    return;
                }
            }

            GUI.color = Color.white;
            //排序
            if (profile.tasks.Count > 1)
            {
   
                if (GUILayout.Button("排序工作项", GUILayout.Height(30)))
                {
   
                    Debug.Log("排序打包工作项");
                    profile.tasks.Sort(new BuildTaskComparer());
                    return;
                }
            }
        }

        /// <summary>
        /// 任务项
        /// </summary>
        private void OnListGUI()
        {
   
            //新旧版本号
            if (profile.tasks.Count > 0)
            {
   
                GUILayout.Space(10);
                //版本选项
                GUILayout.BeginHorizontal();
                GUILayout.Label("版本选项:", GUILayout.Width(70));
                var newVO = (VersionOptions)EditorGUILayout.EnumFlagsField(profile.versionOptions);
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值