BuildReport
The BuildReport API gives you information about the Unity build process.
Read time 6 minutesLast updated 4 days ago
Definition
- Type: Class
- Namespace: UnityEditor.Build.Reporting
- Assembly: UnityEditor.CoreModule
- Inherits from: Object
public sealed class BuildReport : Object
Remarks
A BuildReport object is returned by BuildPipeline.BuildPlayer and can be used to discover information about the file output, the build steps taken, and other platform-specific information such as native code stripping. BuildPipeline.BuildContentDirectory also returns a build report.
For AssetBundle builds the BuildReport is available by calling BuildReport.GetLatestReport immediately after calling BuildPipeline.BuildAssetBundles.
For builds tracked in the BuildHistory, use BuildHistory.LoadBuildReport to load a BuildReport from the build history.
Additional Resources: BuildHistory, BuildReportSummary
Examples
using System.IO;using System.Linq;using System.Text;using UnityEditor;using UnityEditor.Build;using UnityEditor.Build.Content;using UnityEditor.Build.Reporting;using UnityEngine;public class BuildReportExample{ [MenuItem("Example/Build AssetBundle")] static public void BuildBundles() { string buildOutputDirectory = "BuildOutput"; if (!Directory.Exists(buildOutputDirectory)) Directory.CreateDirectory(buildOutputDirectory); var bundleDefinitions = new AssetBundleBuild[] { new AssetBundleBuild() { assetBundleName = "MyBundle", assetNames = new string[] { "Assets/Scenes/SampleScene.unity" } } }; MyTroublesomeBuildCallback.forceFailedBuild = true; BuildPipeline.BuildAssetBundles( buildOutputDirectory, bundleDefinitions, BuildAssetBundleOptions.ForceRebuildAssetBundle, EditorUserBuildSettings.activeBuildTarget); MyTroublesomeBuildCallback.forceFailedBuild = false; BuildReport report = BuildReport.GetLatestReport(); if (report != null) { var sb = new StringBuilder(); sb.AppendLine("Build result : " + report.summary.result); sb.AppendLine("Build size : " + report.summary.totalSize + " bytes"); sb.AppendLine("Build time : " + report.summary.totalTime); sb.AppendLine("Error summary : " + report.SummarizeErrors()); sb.Append(LogBuildReportSteps(report)); sb.AppendLine(LogBuildMessages(report)); Debug.Log(sb.ToString()); } else { // Certain errors like invalid input can fail the build immediately, with no BuildReport written Debug.Log("AssetBundle build failed"); } } public static string LogBuildReportSteps(BuildReport buildReport) { var sb = new StringBuilder(); sb.AppendLine($"Build steps: {buildReport.steps.Length}"); int maxWidth = buildReport.steps.Max(s => s.name.Length + s.depth) + 3; foreach (var step in buildReport.steps) { string rawStepOutput = new string('-', step.depth + 1) + ' ' + step.name; sb.AppendLine($"{rawStepOutput.PadRight(maxWidth)}: {step.duration:g}"); } return sb.ToString(); } public static string LogBuildMessages(BuildReport buildReport) { var sb = new StringBuilder(); foreach (var step in buildReport.steps) { foreach (var message in step.messages) // If desired, this logic could ignore any Info or Warning messages to focus on more serious messages sb.AppendLine($"[{message.type}] {message.content}"); } string messages = sb.ToString(); if (messages.Length > 0) return "Messages logged during Build:\n" + messages; else return ""; }} // For the purpose of demonstration, this callback logs different types of errors and forces a build failureclass MyTroublesomeBuildCallback : AssetPostprocessor{ const string k_TempFilePath = "Temp/MyTroublesomeBuildCallback.flag.isTrue"; public static bool forceFailedBuild { get { return File.Exists(k_TempFilePath); } set { if (value && !File.Exists(k_TempFilePath)) { File.WriteAllText(k_TempFilePath, string.Empty); } else if (!value && File.Exists(k_TempFilePath)) { File.Delete(k_TempFilePath); } } } public override uint GetVersion() => 1; public override int GetPostprocessOrder() => 0; public void OnProcessScene(UnityEngine.SceneManagement.Scene scene, SceneImportContext sceneImportContext) { if (!forceFailedBuild) return; Debug.Log("MyTroublesomeBuildCallback called for " + scene.name); Debug.LogError("Logging an error"); throw new BuildFailedException("Forcing the build to stop"); }}
Properties
Property | Description |
|---|---|
| contentSummary | Retrieve statistics about the content of the build, such as total sizes, object counts, and breakdowns by Unity object type and source asset. |
| packedAssets | An array of all the PackedAssets generated by the build process. |
| scenesUsingAssets | An optional array of ScenesUsingAssets generated by the build process if BuildOptions.DetailedBuildReport was used during the build. |
| steps | An array of all the BuildSteps that took place during the build process. |
| strippingInfo | The StrippingInfo object for the build. |
| summary | A BuildSummary containing overall statistics and data about the build process. |
Methods
Method | Description |
|---|---|
| GetFiles | Returns an array of all the files output by the build process. |
| GetRootAssetPaths | Retrieve the array of paths of root assets that were built in a ContentDirectory build. |
| SummarizeErrors | Returns a string summarizing any errors that occurred during the build |
Static Methods
Method | Description |
|---|---|
| GetLatestReport | Obtains the build report generated by the most recent Player, Content Directory, or AssetBundle build. |
| LoadReport | Loads a BuildReport from the specified file path. |
Inheritance
Operators
Operator | Description |
|---|---|
| operator == | Compares two object references to see if they refer to the same object. |
| bool | Determines whether the object exists. |
| operator != | Compares if two objects refer to a different object. |