示例#1
0
        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;
            }
        }