private void ProcessBuilds() { EditorApplication.delayCall -= ProcessBuilds; if (m_OriginalBuildTarget <= 0) { var invalidTarget = m_OriginalBuildTarget; Clear(); throw new Exception($"Original build target is invalid: {invalidTarget}"); } // Editor is compiling, wait until other frame if (EditorApplication.isCompiling) { EditorApplication.delayCall += ProcessBuilds; return; } QueuedBuild currentBuild = GetNextUnfinishedBuild(); while (currentBuild != null) { var t = (UnityEditor.BuildTarget)currentBuild.sortingIndex; var b = ToBuildConfiguration(currentBuild.buildConfigurationGuid); if (t == UnityEditor.BuildTarget.NoTarget || t == EditorUserBuildSettings.activeBuildTarget) { currentBuild.buildPipelineResult = JsonSerialization.Serialize(b.Build()); currentBuild.buildFinished = true; } else { try { if (b.GetComponent <IBuildPipelineComponent>().SetupEnvironment()) { // Show dialog before actual build dialog, this way it's clear what's happening EditorUtility.DisplayProgressBar("Hold on...", $"Switching to {t}", 0.0f); return; } } catch { m_QueueBuilds.Clear(); throw; } } currentBuild = GetNextUnfinishedBuild(); } // No more builds to run? if (currentBuild == null) { // We're done if (m_OriginalBuildTarget == EditorUserBuildSettings.activeBuildTarget) { EditorUtility.ClearProgressBar(); m_OnAllBuildsCompletedEvent.Invoke(m_QueueBuilds.Select(m => { var buildPipelineResult = TypeConstruction.Construct <BuildPipelineResult>(); JsonSerialization.DeserializeFromString <BuildPipelineResult>(m.buildPipelineResult, ref buildPipelineResult); return(buildPipelineResult); }).ToArray()); Clear(); } else { EditorUtility.DisplayProgressBar("Hold on...", $"Switching to original build target {m_OriginalBuildTarget}", 0.0f); // Restore original build target EditorUserBuildSettings.SwitchActiveBuildTarget(UnityEditor.BuildPipeline.GetBuildTargetGroup(m_OriginalBuildTarget), m_OriginalBuildTarget); } return; } }