Files
Fishing2NetTest/Assets/Scripts/Editor/Builder/Builder.cs
2026-03-05 18:07:55 +08:00

166 lines
4.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using NBC.Asset.Editor;
using UnityEditor;
using Debug = UnityEngine.Debug;
namespace NBF
{
/// <summary>
/// 打包器
/// </summary>
public class Builder
{
/// <summary>
/// 任务id对应的类型
/// </summary>
private static readonly Dictionary<int, Type> _buildTaskTypes = new Dictionary<int, Type>();
/// <summary>
/// 任务配置信息
/// </summary>
public static readonly List<BuildTaskInfoAttribute> BuildTaskInfo = new List<BuildTaskInfoAttribute>();
[InitializeOnLoadMethod]
private static void OnInitialize()
{
FindTasks();
}
private static void FindTasks()
{
var types = EditUtil.FindAllSubclass<BaseBuildTask>();
foreach (var t in types)
{
var attributes = t.GetCustomAttributes(typeof(BuildTaskInfoAttribute), true);
foreach (var attribute in attributes)
{
if (attribute is BuildTaskInfoAttribute idAttribute && idAttribute.Id > 0)
{
_buildTaskTypes[idAttribute.Id] = t;
BuildTaskInfo.Add(idAttribute);
}
}
}
BuildTaskInfo.Sort((a, b) => a.Id - b.Id);
}
private static Type GetTaskType(int id)
{
return _buildTaskTypes.GetValueOrDefault(id);
}
#region
/// <summary>
/// 供cmd调用的打包接口
/// </summary>
/// <exception cref="Exception"></exception>
public static void RunBuild()
{
var ver = string.Empty;
var ding = 0;
List<int> ids = new List<int>();
List<string> systemValue = new List<string>(Environment.GetCommandLineArgs());
foreach (var str in systemValue)
{
var arr = str.Split("=");
if (arr.Length > 1)
{
var key = arr[0];
var value = arr[1];
if (key == "v")
{
ver = value;
}
else if (key == "ids")
{
var idArr = value.Split(',');
if (idArr.Length > 0)
{
foreach (var id in idArr)
{
if (int.TryParse(id, out var i) && i > 0)
{
ids.Add(i);
}
}
}
}
}
}
if (string.IsNullOrEmpty(ver) || ids.Count < 1)
{
throw new Exception("参数错误");
}
BuildContext buildContext = new BuildContext
{
Ver = ver
};
RunBuildTasks(buildContext, ids.ToArray());
}
public static void RunBuildTasks(BuildContext buildContext, params int[] ids)
{
Debug.Log("开始执行构建任务");
List<Type> types = ids.Select(GetTaskType).Where(type => type != null).ToList();
if (types.Count < 1)
{
throw new Exception("task id error!");
}
List<BaseBuildTask> buildTasks = new List<BaseBuildTask>();
foreach (var type in types)
{
if (Activator.CreateInstance(type) is BaseBuildTask task)
{
buildTasks.Add(task);
}
}
foreach (var task in buildTasks)
{
var sw = new Stopwatch();
sw.Start();
task.Run(buildContext);
sw.Stop();
Debug.Log($"Run 任务={task.GetType().Name} time={sw.ElapsedMilliseconds / 1000f}s");
}
}
#endregion
public static BuildTargetGroup GetTargetGroup()
{
BuildTarget activeTarget = EditorUserBuildSettings.activeBuildTarget;
var targetGroup = BuildTargetGroup.Unknown;
if (activeTarget == BuildTarget.StandaloneWindows || activeTarget == BuildTarget.StandaloneWindows64)
{
targetGroup = BuildTargetGroup.Standalone;
}
else if (activeTarget == BuildTarget.Android)
{
targetGroup = BuildTargetGroup.Android;
}
else if (activeTarget == BuildTarget.iOS)
{
targetGroup = BuildTargetGroup.iOS;
}
return targetGroup;
}
}
}