IPostprocessBuildWithContext
Описание
Реализуйте этот интерфейс, чтобы выполнить код сразу после завершения сборки плеера или AssetBundle.
Это полезно для задач, которые должны выполняться после завершения сборки, даже если сборка не удалась или была отменена. Например, может потребоваться очистить ресурсы, создать аналитику или отчеты или настроить выходные данные сборки. Обратный вызов postprocess выполняется независимо от того, завершилась ли сборка успешно, с ошибкой или была отменена, если соответствующая команда выполняется. IPreprocessBuildWithContext callback run. Он пропускается только в том случае, если ранняя проверка не позволяет начать сборку.
В качестве последнего шага сборки Player или сборки AssetBundle, Unity использует IOrderedCallback.callbackOrder свойство на каждой реализации, чтобы определить порядок, в котором вызывать обратные вызова.
Основное отличие между этим интерфейсом и IPostprocessBuildWithReport или Build.IPostprocessBuild это то, что этот обратный вызов вызывается на сборках AssetBundle и сборках Player, и он вызывается даже для отмененных и неудачных сборок.
Дополнительные сведения о обратных вызовах сборки см. в Использование обратных вызовов сборки.
Дополнительные ресурсы: IPreprocessBuildWithContext, BuildPipeline.BuildPlayer, BuildPipeline.BuildAssetBundles.
using System.Linq; using System.Text; using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEngine;
// To try this example add this code into an Editor-only assembly, // run a Player build or AssetBundle build, and then look for the message in the console. class BuildPostProcessor : IPostprocessBuildWithContext { public int callbackOrder { get { return 100; } } public void OnPostprocessBuild(BuildCallbackContext ctx) { // Log some information from the BuildCallbackContext // Note: OnPostprocessBuild callbacks are invoked after the build process completes, // regardless of whether it succeeded, failed, or was cancelled. // However, the content of the BuildCallbackContext.Report may not be completely finalized. // For example, the summary.buildEndedAt has not been be determined, // and the incomplete "parent" BuildSteps still report 0 for their durations. var summary = ctx.Report.summary;
// This callback runs whether the build succeeded, failed, or was cancelled if (summary.result != BuildResult.Succeeded) { Debug.LogWarning($"Build completed with result: {summary.result}"); }
var files = ctx.Report.GetFiles(); ulong size = 0; foreach (var file in files) size += file.size;
var sb = new StringBuilder(); sb.AppendLine("Build completed"); sb.AppendLine($" Target: {summary.platform}"); sb.AppendLine($" Output Location: {summary.outputPath}"); sb.AppendLine($" Number of output files: {files.Length}"); sb.AppendLine($" Total size in bytes: {size}"); sb.AppendLine($" Starting time: {summary.buildStartedAt.ToLocalTime().ToShortTimeString()}"); sb.AppendLine();
var buildSteps = ctx.Report.steps; sb.AppendLine($"Build steps: {buildSteps.Length}"); int maxWidth = buildSteps.Max(s => s.name.Length + s.depth) + 2; foreach (var step in buildSteps) { string rawStepOutput = new string('-', step.depth) + ' ' + step.name; sb.AppendLine($"{rawStepOutput.PadRight(maxWidth)}: {step.duration:g}"); }
Debug.Log(sb.ToString()); } }
Открытые методы
| Метод | Описание |
|---|---|
| OnPostprocessBuild | Реализуйте эту функцию для получения обратного вызова после завершения сборки. |