# BuildReport

> The BuildReport API gives you information about the Unity build process.

## Definition

* **Type:** Class
* **Namespace:** [UnityEditor.Build.Reporting](/engine/6000.3/script-reference/unityeditor/build/reporting.md)
* **Assembly:** UnityEditor
* **Inherits from:** [Object](/engine/6000.3/script-reference/unityengine/object.md)

```csharp
public sealed class BuildReport : Object
```

## Remarks

A BuildReport object is returned by [BuildPipeline.BuildPlayer](/engine/6000.3/script-reference/unityeditor/buildpipeline/buildplayer.md) and can be used to discover information about the files output, the build steps taken, and other platform-specific information such as native code stripping.

For AssetBundle builds the BuildReport is available by calling [BuildReport.GetLatestReport](/engine/6000.3/script-reference/unityeditor/build/reporting/buildreport/getlatestreport.md) immediately after calling [BuildPipeline.BuildAssetBundles](/engine/6000.3/script-reference/unityeditor/buildpipeline/buildassetbundles.md).

## Examples

```csharp
using System.IO;
using System.Linq;
using System.Text;
using UnityEditor;
using UnityEditor.Build;
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" }
            }
        };

        BuildPipeline.BuildAssetBundles(
            buildOutputDirectory,
            bundleDefinitions,
            BuildAssetBundleOptions.ForceRebuildAssetBundle,
            EditorUserBuildSettings.activeBuildTarget);

        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 failure
[BuildCallbackVersion(1)]
class MyTroublesomeBuildCallback : IProcessSceneWithReport
{
    public int callbackOrder { get { return 0; } }
    public void OnProcessScene(UnityEngine.SceneManagement.Scene scene, BuildReport report)
    {
        Debug.Log("MyTroublesomeBuildCallback called for " + scene.name);
        Debug.LogError("Logging an error");

        throw new BuildFailedException("Forcing the build to stop");
    }
}
```

## Properties

| Property                                                                                                          | Description                                                                                                                                                                                                                                                                                                 |
| ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [packedAssets](/engine/6000.3/script-reference/unityeditor/build/reporting/buildreport/packedassets.md)           | An array of all the [PackedAssets](/engine/6000.3/script-reference/unityeditor/build/reporting/packedassets.md) generated by the build process.                                                                                                                                                             |
| [scenesUsingAssets](/engine/6000.3/script-reference/unityeditor/build/reporting/buildreport/scenesusingassets.md) | An optional array of [ScenesUsingAssets](/engine/6000.3/script-reference/unityeditor/build/reporting/scenesusingassets.md) generated by the build process if [BuildOptions.DetailedBuildReport](/engine/6000.3/script-reference/unityeditor/buildoptions/detailedbuildreport.md) was used during the build. |
| [steps](/engine/6000.3/script-reference/unityeditor/build/reporting/buildreport/steps.md)                         | An array of all the [BuildStep](/engine/6000.3/script-reference/unityeditor/build/reporting/buildstep.md)s that took place during the build process.                                                                                                                                                        |
| [strippingInfo](/engine/6000.3/script-reference/unityeditor/build/reporting/buildreport/strippinginfo.md)         | The [StrippingInfo](/engine/6000.3/script-reference/unityeditor/build/reporting/strippinginfo.md) object for the build.                                                                                                                                                                                     |
| [summary](/engine/6000.3/script-reference/unityeditor/build/reporting/buildreport/summary.md)                     | A [BuildSummary](/engine/6000.3/script-reference/unityeditor/build/reporting/buildsummary.md) containing overall statistics and data about the build process.                                                                                                                                               |

## Methods

| Method                                                                                                        | Description                                                            |
| ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| [GetFiles](/engine/6000.3/script-reference/unityeditor/build/reporting/buildreport/getfiles.md)               | Returns an array of all the files output by the build process.         |
| [SummarizeErrors](/engine/6000.3/script-reference/unityeditor/build/reporting/buildreport/summarizeerrors.md) | Returns a string summarizing any errors that occurred during the build |

## Static Methods

| Method                                                                                                        | Description                                                                      |
| ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| [GetLatestReport](/engine/6000.3/script-reference/unityeditor/build/reporting/buildreport/getlatestreport.md) | Return the build report generated by the most recent Player or AssetBundle build |

## Inheritance

**Inherited Members:**

* [Object.GetInstanceID()](/engine/6000.3/script-reference/unityengine/object/getinstanceid.md)
* [Object.GetHashCode()](/engine/6000.3/script-reference/unityengine/object/gethashcode.md)
* [Object.InstantiateAsync\<T>(T)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, Transform)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, Vector3, Quaternion)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, Transform, Vector3, Quaternion)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, Transform)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, Vector3, Quaternion)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, ReadOnlySpan\<Vector3>, ReadOnlySpan\<Quaternion>)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, Transform, Vector3, Quaternion)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, Transform, Vector3, Quaternion, CancellationToken)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, Transform, ReadOnlySpan\<Vector3>, ReadOnlySpan\<Quaternion>)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, Transform, ReadOnlySpan\<Vector3>, ReadOnlySpan\<Quaternion>, CancellationToken)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, InstantiateParameters, CancellationToken)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, InstantiateParameters, CancellationToken)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, Vector3, Quaternion, InstantiateParameters, CancellationToken)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, Vector3, Quaternion, InstantiateParameters, CancellationToken)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.InstantiateAsync\<T>(T, int, ReadOnlySpan\<Vector3>, ReadOnlySpan\<Quaternion>, InstantiateParameters, CancellationToken)](/engine/6000.3/script-reference/unityengine/object/instantiateasync.md)
* [Object.Instantiate(Object, Vector3, Quaternion)](/engine/6000.3/script-reference/unityengine/object/instantiate.md#instantiate\(object-vector3-quaternion\))
* [Object.Instantiate(Object, Vector3, Quaternion, Transform)](/engine/6000.3/script-reference/unityengine/object/instantiate.md#instantiate\(object-vector3-quaternion-transform\))
* [Object.Instantiate(Object)](/engine/6000.3/script-reference/unityengine/object/instantiate.md#instantiate\(object\))
* [Object.Instantiate(Object, Scene)](/engine/6000.3/script-reference/unityengine/object/instantiate.md#instantiate\(object-scene\))
* [Object.Instantiate\<T>(T, InstantiateParameters)](/engine/6000.3/script-reference/unityengine/object/instantiate.md)
* [Object.Instantiate\<T>(T, Vector3, Quaternion, InstantiateParameters)](/engine/6000.3/script-reference/unityengine/object/instantiate.md)
* [Object.Instantiate(Object, Transform)](/engine/6000.3/script-reference/unityengine/object/instantiate.md#instantiate\(object-transform\))
* [Object.Instantiate(Object, Transform, bool)](/engine/6000.3/script-reference/unityengine/object/instantiate.md#instantiate\(object-transform-bool\))
* [Object.Instantiate\<T>(T)](/engine/6000.3/script-reference/unityengine/object/instantiate.md)
* [Object.Instantiate\<T>(T, Vector3, Quaternion)](/engine/6000.3/script-reference/unityengine/object/instantiate.md)
* [Object.Instantiate\<T>(T, Vector3, Quaternion, Transform)](/engine/6000.3/script-reference/unityengine/object/instantiate.md)
* [Object.Instantiate\<T>(T, Transform)](/engine/6000.3/script-reference/unityengine/object/instantiate.md)
* [Object.Instantiate\<T>(T, Transform, bool)](/engine/6000.3/script-reference/unityengine/object/instantiate.md)
* [Object.Destroy(Object, float)](/engine/6000.3/script-reference/unityengine/object/destroy.md)
* [Object.DestroyImmediate(Object, bool)](/engine/6000.3/script-reference/unityengine/object/destroyimmediate.md)
* [Object.FindObjectsByType(Type, FindObjectsSortMode)](/engine/6000.3/script-reference/unityengine/object/findobjectsbytype.md#findobjectsbytype\(type-findobjectssortmode\))
* [Object.FindObjectsByType(Type, FindObjectsInactive, FindObjectsSortMode)](/engine/6000.3/script-reference/unityengine/object/findobjectsbytype.md#findobjectsbytype\(type-findobjectsinactive-findobjectssortmode\))
* [Object.DontDestroyOnLoad(Object)](/engine/6000.3/script-reference/unityengine/object/dontdestroyonload.md)
* [Object.FindObjectsByType\<T>(FindObjectsSortMode)](/engine/6000.3/script-reference/unityengine/object/findobjectsbytype.md#findobjectsbytypet\(findobjectssortmode\))
* [Object.FindObjectsByType\<T>(FindObjectsInactive, FindObjectsSortMode)](/engine/6000.3/script-reference/unityengine/object/findobjectsbytype.md#findobjectsbytypet\(findobjectsinactive-findobjectssortmode\))
* [Object.FindFirstObjectByType\<T>()](/engine/6000.3/script-reference/unityengine/object/findfirstobjectbytype.md#findfirstobjectbytypet\(\))
* [Object.FindAnyObjectByType\<T>()](/engine/6000.3/script-reference/unityengine/object/findanyobjectbytype.md#findanyobjectbytypet\(\))
* [Object.FindFirstObjectByType\<T>(FindObjectsInactive)](/engine/6000.3/script-reference/unityengine/object/findfirstobjectbytype.md#findfirstobjectbytypet\(findobjectsinactive\))
* [Object.FindAnyObjectByType\<T>(FindObjectsInactive)](/engine/6000.3/script-reference/unityengine/object/findanyobjectbytype.md#findanyobjectbytypet\(findobjectsinactive\))
* [Object.FindFirstObjectByType(Type)](/engine/6000.3/script-reference/unityengine/object/findfirstobjectbytype.md#findfirstobjectbytype\(type\))
* [Object.FindAnyObjectByType(Type)](/engine/6000.3/script-reference/unityengine/object/findanyobjectbytype.md#findanyobjectbytype\(type\))
* [Object.FindFirstObjectByType(Type, FindObjectsInactive)](/engine/6000.3/script-reference/unityengine/object/findfirstobjectbytype.md#findfirstobjectbytype\(type-findobjectsinactive\))
* [Object.FindAnyObjectByType(Type, FindObjectsInactive)](/engine/6000.3/script-reference/unityengine/object/findanyobjectbytype.md#findanyobjectbytype\(type-findobjectsinactive\))
* [Object.ToString()](/engine/6000.3/script-reference/unityengine/object/tostring.md)
* [Object.name](/engine/6000.3/script-reference/unityengine/object/name.md)
* [Object.hideFlags](/engine/6000.3/script-reference/unityengine/object/hideflags.md)

### Operators

| Operator                                                                           | Description                                                             |
| ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| [operator ==](/engine/6000.3/script-reference/unityengine/object/op-equality.md)   | Compares two object references to see if they refer to the same object. |
| [bool](/engine/6000.3/script-reference/unityengine/object/op-implicit.md)          | Determines whether the object exists.                                   |
| [operator !=](/engine/6000.3/script-reference/unityengine/object/op-inequality.md) | Compares if two objects refer to a different object.                    |
