using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using UnityEditor; using UnityEngine; using Debug = UnityEngine.Debug; namespace NBC.Asset.Editor { public class Builder { private static readonly Dictionary _gatherTypes = new Dictionary(); private static readonly Dictionary _buildTaskTypes = new Dictionary(); #region 内部方法 [InitializeOnLoadMethod] private static void OnInitialize() { FindGathers(); FindTasks(); } private static void FindGathers() { var types = EditUtil.FindAllSubclass(); foreach (var t in types) { var attributes = t.GetCustomAttributes(typeof(BindAttribute), true); foreach (var attribute in attributes) { if (attribute is BindAttribute bindAttribute && bindAttribute.BindObject is BundleMode mode) { _gatherTypes[mode] = t; } } } } private static void FindTasks() { var types = EditUtil.FindAllSubclass(); foreach (var t in types) { var attributes = t.GetCustomAttributes(typeof(IdAttribute), true); foreach (var attribute in attributes) { if (attribute is IdAttribute idAttribute && idAttribute.Id > 0) { _buildTaskTypes[idAttribute.Id] = t; } } } } private static Type GetGatherType(BundleMode mode) { return _gatherTypes.TryGetValue(mode, out var t) ? t : null; } private static Type GetTaskType(int id) { return _buildTaskTypes.TryGetValue(id, out var t) ? t : null; } #endregion internal static BuildAsset[] GatherAsset(PackageConfig packageConfig, GroupConfig groupConfig) { var type = GetGatherType(groupConfig.BundleMode); if (type != null) { if (Activator.CreateInstance(type) is GatherBase instance) { return instance.Run(packageConfig, groupConfig); } } return Array.Empty(); } public static void Gather() { RunBuildTasks(TaskId.Gather); } public static void Build() { RunBuildTasks( TaskId.Gather, TaskId.BuildBundle, TaskId.GenPackageData, TaskId.GenVersionData, TaskId.CopyVersionBundle, TaskId.CopyToStreamingAssets ); // TaskId.GenVersionData, // TaskId.CopyVersionBundle, // TaskId.CopyToStreamingAssets } public static void RunBuildTasks(params int[] ids) { if (ids.Length < 1) { throw new Exception("not set task id!"); } 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 BuildTask task) { buildTasks.Add(task); } } BuildContext buildContext = new BuildContext(); 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"); } } } }