private static void UpdateTask() { if (isUpdateTask) { return; } isUpdateTask = true; try { for (int i = 0; CanExecute && i < TaskQueues.Count; i++) { var queue = TaskQueues[i]; while (CanExecute) { TaskAction action = null; switch (queue.status) { case Status.Initialize: queue.onStarted.current = 0; queue.onEnded.current = 0; queue.status = Status.Started; Save(); break; case Status.Started: while (queue.onStarted.HasNext()) { queue.onStarted.Next().Callback(); } queue.status = Status.Task; Save(); break; case Status.Task: action = Next(queue.tasks); if (action == null) { queue.status = Status.Ended; Save(); } else { queue.onTaskBefore.current = 0; queue.onTaskAfter.current = 0; } break; default: break; } if (queue.status == Status.Ended) { TaskQueues.RemoveAt(i); Save(); while (queue.onEnded.HasNext()) { queue.onEnded.Next().Callback(); } i--; break; } if (action == null) { continue; } if (action.Callback != null) { bool showProgressBar = false; try { if (queue.progressBarEnabled) { EditorUtility.DisplayProgressBar(action.Display, null, 0); showProgressBar = true; } if (queue.status == Status.Task) { while (queue.onTaskBefore.HasNext()) { queue.onTaskBefore.Next().Callback(); } } DateTime dt = DateTime.Now; action.Callback(); Debug.Log(EditorOneBuild.BuildLogPrefix + "step " + queue.tasks.current + "/" + queue.tasks.Count + ", [" + action.Callback.Method.DeclaringType.FullName + "." + action.Callback.Method.Name + "] time: " + (DateTime.Now - dt).TotalSeconds.ToString("0.#") + "s"); } catch (Exception ex) { Debug.LogError("build error " + action.Callback.Method.Name); Debug.LogException(ex); queue.status = Status.Ended; Save(); } finally { if (showProgressBar) { showProgressBar = false; EditorUtility.ClearProgressBar(); } if (queue.status == Status.Task) { while (queue.onTaskAfter.HasNext()) { queue.onTaskAfter.Next().Callback(); } } } } } } } catch (Exception ex) { Debug.LogException(ex); } finally { isUpdateTask = false; } EditorApplication.update -= UpdateTask; }