Unity-Technologies/UnityCsReference · error · ArgumentException

Build profile is invalid.

Error message

Build profile is invalid.

What it means

ArgumentException thrown by BuildPipeline.BuildPlayer(BuildPlayerWithProfileOptions) when buildPlayerWithProfileOptions.buildProfile is null. The build profile carries platform target, scenes, scripting backend, and other build configuration; a null profile means no valid build configuration was supplied.

Source

Thrown at Editor/Mono/BuildPipeline/BuildPipeline.bindings.cs:136

        internal static string[] RetrieveAdditionalBuildReportDirectoriesFromPlayerContext()
        {
            if (BuildPlayerContext.ActiveInstance == null)
                return Array.Empty<string>();
            return BuildPlayerContext.ActiveInstance.RetrieveAdditionalBuildReportDirectories();
        }

        ///<summary>Builds a player from a specific build profile.</summary>
        ///<param name="buildPlayerWithProfileOptions">Provide various options to control the behavior of <see cref="BuildPipeline.BuildPlayer" /> when using a <see cref="BuildProfile">build profile</see>.</param>
        ///<returns>A <see cref="BuildReport" /> object containing build process information.</returns>
        /// <exception cref="ArgumentException">Throws if build profile is null.</exception>
        ///<example>
        ///  <code source="../../../Modules/ContentBuild/Tests/local.test.build-examples/Editor/BuildPipeline/BuildPipeline_BuildPlayerWithBuildProfile.cs"/>
        ///</example>
        public static BuildReport BuildPlayer(BuildPlayerWithProfileOptions buildPlayerWithProfileOptions)
        {
            var buildProfile = buildPlayerWithProfileOptions.buildProfile;
            if (buildProfile == null)
                throw new ArgumentException("Build profile is invalid.");

            BuildProfileContext.activeProfile = buildProfile;
            var buildPlayerOptions = BuildProfileModuleUtil.GetBuildPlayerOptionsFromActiveProfile(
                buildPlayerWithProfileOptions.locationPathName, buildPlayerWithProfileOptions.assetBundleManifestPath, buildPlayerWithProfileOptions.options, buildPlayerWithProfileOptions.extraScriptingDefines);
            return BuildPlayer(buildPlayerOptions);
        }

        // Legacy signature for calling BuildPlayer()
        // Do not add any more overloads of BuildPlayer, or arguments to this method.  Functionality should be added by extending BuildPlayerOptions
        ///<summary>Builds a Player. These overloads are still supported, but will be replaced. Please use BuildPlayer(<see cref="BuildPlayerOptions" /> buildPlayerOptions) and BuildPlayer(<see cref="BuildPlayerWithProfileOptions" /> buildPlayerWithProfileOptions) instead.</summary>
        ///<param name="levels">The scenes to include in the build. If empty, the build includes only the current open scene. Paths are relative to the project folder, for example <c>Assets/MyLevels/MyScene.unity</c>.</param>
        ///<param name="locationPathName">The path where the application will be built. For information on the platform extensions to include in the path, refer to [Build path requirements for target platforms](xref:um-build-path-requirements).</param>
        ///<param name="target">The <see cref="BuildTarget" /> to build.</param>
        ///<param name="options">Additional <see cref="BuildOptions" />, like whether to run the built player.</param>
        ///<returns>A <see cref="BuildReport" /> object containing build process information.</returns>
        public static BuildReport BuildPlayer(EditorBuildSettingsScene[] levels, string locationPathName, BuildTarget target, BuildOptions options)
        {
            BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();

View on GitHub (pinned to 225b0fbdb5)

Solutions

  1. Ensure buildProfile is assigned before calling BuildPipeline.BuildPlayer.
  2. If loading a profile from an asset, verify AssetDatabase.LoadAssetAtPath returns a non-null BuildProfile.
  3. Add a null check: if (options.buildProfile == null) { /* handle */ return; }
  4. Validate the BuildProfile asset exists at the expected path and is of the correct type.

Example fix

// before
var options = new BuildPlayerWithProfileOptions
{
    locationPathName = "Build/app.exe",
    // buildProfile missing!
};
BuildPipeline.BuildPlayer(options);
// after
var profile = AssetDatabase.LoadAssetAtPath<BuildProfile>("Assets/Profiles/default.asset");
if (profile == null) throw new InvalidOperationException("BuildProfile asset not found.");
var options = new BuildPlayerWithProfileOptions
{
    buildProfile = profile,
    locationPathName = "Build/app.exe",
};
BuildPipeline.BuildPlayer(options);
Defensive patterns

Strategy: validation

Validate before calling

// Validate build profile before calling BuildPlayer
if (buildPlayerWithProfileOptions.buildProfile == null)
{
    Debug.LogError("Build profile is not assigned.");
    return;
}
BuildPipeline.BuildPlayer(buildPlayerWithProfileOptions);

Type guard

static bool HasValidProfile(BuildPlayerWithProfileOptions options)
    => options != null && options.buildProfile != null;

Prevention

When it happens

Trigger: Calling BuildPipeline.BuildPlayer with a BuildPlayerWithProfileOptions object whose buildProfile field is null. Occurs when the profile is not assigned programmatically, when deserialization of build options leaves the profile unset, or when a script constructs options without populating the profile.

Common situations: Scripts that create BuildPlayerWithProfileOptions via new but forget to set buildProfile, build automation that loads profiles from assets where the asset reference is missing, conditional code paths that skip profile assignment, editor scripts referencing a deleted or moved BuildProfile asset.

Related errors


AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13). Data as JSON: /api/errors/8c32ee90b6f7bcb1. Report an issue: GitHub.