打包配置项
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);