我使用了“编辑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