using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using NBC.Asset.Editor;
using UnityEditor;
using Debug = UnityEngine.Debug;
namespace NBF
{
///
/// 打包器
///
public class Builder
{
///
/// 任务id对应的类型
///
private static readonly Dictionary _buildTaskTypes = new Dictionary();
///
/// 任务配置信息
///
public static readonly List BuildTaskInfo = new List();
[InitializeOnLoadMethod]
private static void OnInitialize()
{
FindTasks();
}
private static void FindTasks()
{
var types = EditUtil.FindAllSubclass();
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 对外公共方法
///
/// 供cmd调用的打包接口
///
///
public static void RunBuild()
{
var ver = string.Empty;
var ding = 0;
List ids = new List();
List systemValue = new List(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 types = ids.Select(GetTaskType).Where(type => type != null).ToList();
if (types.Count < 1)
{
throw new Exception("task id error!");
}
List buildTasks = new List();
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;
}
}
}