- Home /
how to get a callback when build was canceled?
I am using unity 2019.2 with Android.
When the build succeeds, OnPostprocessBuild(BuildReport report)
gets called, but not if it is canceled. Is it supposed to? Are there other means?
public class PostProcessor : IPostprocessBuildWithReport
{
public int callbackOrder => 0;
public void OnPostprocessBuild(BuildReport report)
{
//do some stuff
if (report.summary.result != BuildResult.Succeeded) { return; }
#region Platform-specific configurations
switch (report.summary.platform)
{
//do some stuff
}
#endregion
}
}
Answer by hyagogow · Mar 11 at 08:07 PM
Use this BuildHandler class:
using System;
using UnityEditor;
using UnityEngine;
/// <summary>
/// Handler for Builds.
/// <para>
/// Use <see cref="OnBuildStarted"/> and/or <see cref="OnBuildCleanup"/>
/// to execute code during the build process.
/// </para>
/// <para>Class created using https://stackoverflow.com/a/68650717</para>
/// </summary>
[InitializeOnLoad]
public class BuildHandler
{
/// <summary>
/// Action fired when the build process starts.
/// </summary>
public static event Action OnBuildStarted;
/// <summary>
/// Action fired when the build process ends, even though the build is canceled.
/// </summary>
public static event Action OnBuildCleanup;
static BuildHandler () => BuildPlayerWindow.RegisterBuildPlayerHandler(HandleBuildPlayer);
static void HandleBuildPlayer (BuildPlayerOptions buildOptions)
{
try
{
OnBuildStarted?.Invoke();
// Start Unity's default building process.
BuildPlayerWindow.DefaultBuildMethods.BuildPlayer(buildOptions);
}
catch (Exception ex)
{
Exception log = ex.InnerException ?? ex;
Debug.LogException(log);
Debug.LogErrorFormat("{0} in BuildHandler: '{1}'", log.GetType().Name, ex.Message);
}
finally
{
OnBuildCleanup?.Invoke();
}
}
}
Now you have to use the actions OnBuildStarted or OnBuildCleanup.
Here is an example:
using UnityEditor;
using UnityEngine;
[InitializeOnLoad]
public class SomeBuildProcess
{
static SomeBuildProcess ()
{
BuildHandler.OnBuildStarted += HandleBuildStarted;
BuildHandler.OnBuildCleanup += HandleBuildCleanup;
}
~SomeBuildProcess ()
{
BuildHandler.OnBuildStarted -= HandleBuildStarted;
BuildHandler.OnBuildCleanup -= HandleBuildStarted;
}
static void HandleBuildStarted ()
{
Debug.Log("HandleBuildStarted");
}
static void HandleBuildCleanup ()
{
Debug.Log("HandleBuildCleanup");
}
}
Credits for the BuildHandler class: https://stackoverflow.com/a/68650717
If you only care about certain build results, you'll have to check the build result... But the delegate methods takes no parameter, so I'm not sure how to do this. You may need to store the last build result in some static member. Don't forget to clear it on start/end of build.
Your answer
Follow this Question
Related Questions
Distribute terrain in zones 3 Answers
Post-build script not called on failed build? 0 Answers
Facebook SDK An element with the same key already exists in the Dictionary 0 Answers
Preprocess scene on build in Unity 5 0 Answers
Create custom warning dialog on build, if a script or gameobject exists in the scene 2 Answers