Unity Editor检测构建何时失败

我正在尝试使用IPreProcessBuildWithReportIPostProcessBuildWithReport在构建之前将游戏对象添加到场景中,并在构建完成后立即将其从场景中删除。目标是在开发过程中尽量减少层次结构,但在构建过程中将这些对象包括在内。

我的问题发生在构建失败(由于某些错误)时,它在构建开始之前添加了游戏对象,但从未到达失败时删除游戏对象的代码。

是否存在类似的方法来检测构建何时失败而无需构建自己的构建播放器管道? 如果不需要,我真的不想偏离unity的默认构建管道。

如果没有简单的方法,我试图考虑是否有一种方法可以跟踪生成失败的异常或错误并在发生时运行方法。

谢谢,让我知道你们的想法。

编辑:根据要求,下面是一个示例:

    class CustomBuildPipeline : MonoBehaviour,IPreprocessBuildWithReport,IPostprocessBuildWithReport
    {

        public int callbackOrder => 0;

        // CALLED BEFORE THE BUILD
        public void OnPreprocessBuild(BuildReport report)
        {
            // Create and add gameobjects to scene
        }


        // CALLED AFTER THE BUILD
        public void OnPostprocessBuild(BuildReport report)
        {
             // Remove gameobjects from scene once built
        }
    }
}

PreProcess Interface PostProcess Interface

我想知道是否有可能通过某种方式检测何时抛出此buildexception并在其后运行代码的解决方案。

编辑2:我发现这个post可能有解决方案,但是,它可能并不如我所愿。我会尝试一些事情并报告。

gouridetongxingzheng 回答:Unity Editor检测构建何时失败

我使用了“编辑2”中的post提出了一个不错的解决方案。我不知道它是否会在100%的时间内正常工作,如果我选择了较差的解决方案,我希望有人纠正我。这应该允许我在构建开始之前以及构建失败或成功的情况下运行代码,而无需更改统一的构建管道。

    class CustomBuildPipeline : MonoBehaviour,IPreprocessBuildWithReport,IPostprocessBuildWithReport
    {

        public int callbackOrder => 0;

        // CALLED BEFORE THE BUILD
        public void OnPreprocessBuild(BuildReport report)
        {
            // Start listening for errors when build starts
            Application.logMessageReceived += OnBuildError;
        }

        // CALLED DURING BUILD TO CHECK FOR ERRORS
        private void OnBuildError(string condition,string stacktrace,LogType type)
        {
            if (type == LogType.Error)
            {
                // FAILED TO BUILD,STOP LISTENING FOR ERRORS
                Application.logMessageReceived -= OnBuildError;
            }
        }

        // CALLED AFTER THE BUILD
        public void OnPostprocessBuild(BuildReport report)
        {
            // IF BUILD FINISHED AND SUCCEEDED,STOP LOOKING FOR ERRORS
            Application.logMessageReceived -= OnBuildError;
        }
    }
}
,

此方法使用自定义构建处理程序,但仍使用默认构建管道。

使用 BuildHandler.OnBuildStarted 代替(或除)IPreprocessBuildWithReport 进行预处理。对于后处理,使用 BuildHandler.OnBuildCleanup,它在构建完成失败时调用。也可以与 IPostprocessBuildWithReport 结合使用。

[InitializeOnLoad]
public class BuildHandler : MonoBehaviour
{
    public static event Action OnBuildStarted;
    public static event Action OnBuildCleanup;

    static BuildHandler()
    {
        BuildPlayerWindow.RegisterBuildPlayerHandler(Build);
    }

    private static void Build(BuildPlayerOptions buildOptions)
    {
        try
        {
            BuildStarted();

            //now start Unity's default building procedure
            BuildPlayerWindow.DefaultBuildMethods.BuildPlayer(buildOptions);
        }
        catch (BuildPlayerWindow.BuildMethodException) { } //logged internally
        catch (Exception ex)
        {
            Exception log = ex.InnerException == null ? ex : ex.InnerException;
            Debug.LogException(log);
            Debug.LogErrorFormat("{0} in BuildHandler: '{1}'",log.GetType().Name,ex.Message);
        }
        finally
        {
            BuildCleanup();
        }
    }

    private static void BuildStarted()
    {
        try
        {
            if (OnBuildStarted != null)
                OnBuildStarted.Invoke();
        }
        catch (Exception ex)
        {
            throw new Exception("OnBuildStarted failed",ex);
        }
    }

    private static void BuildCleanup()
    {
        if (OnBuildCleanup != null)
        {
            foreach (Action cleanupBuild in OnBuildCleanup.GetInvocationList())
            {
                try
                {
                    cleanupBuild.Invoke();
                }
                catch (Exception ex)
                {
                    Object context = cleanupBuild.Target as Object;
                    Debug.LogException(ex,context);
                    Debug.LogWarning("Caught exception while BuildHandler.OnBuildCleanup... Continuing");
                }
            }
        }
    }
}
本文链接:https://www.f2er.com/3108942.html

大家都在问