Skip to content

Unity Build Script

The Build Pipeline uses UNITY_EXECUTE_METHOD to invoke a static C# method that builds your game. You need to create this method in an Editor script in your Unity project.

What the build script does

When the Build Server runs your pipeline, it launches Unity in batch mode and calls your build method. Your method is responsible for:

  1. Configuring player settings (product name, bundle identifier, version)
  2. Gathering the scenes to include
  3. Calling BuildPipeline.BuildPlayer() with the correct target and output path
  4. Exiting with code 1 on failure so the pipeline knows the build failed

Example build script

Create this file at Assets/Build/Editor/BuildProduct.cs in your Unity project:

using System.Linq;
using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEngine;
namespace YourGame
{
public static class BuildScript
{
[MenuItem("YourGame/Build/Build Android")]
public static void BuildProduct()
{
EditorUserBuildSettings.SwitchActiveBuildTarget(
BuildTargetGroup.Android, BuildTarget.Android);
PlayerSettings.companyName = "Your Studio";
PlayerSettings.productName = "YourGame";
PlayerSettings.bundleVersion = "1.0.0";
PlayerSettings.Android.bundleVersionCode = 1;
var scenes = EditorBuildSettings.scenes
.Where(s => s.enabled)
.Select(s => s.path)
.ToArray();
if (scenes.Length == 0)
{
Debug.LogError("No scenes enabled in Build Settings.");
EditorApplication.Exit(1);
return;
}
var options = new BuildPlayerOptions
{
scenes = scenes,
locationPathName = "Builds/Android/YourGame.apk",
target = BuildTarget.Android,
options = BuildOptions.None
};
var report = BuildPipeline.BuildPlayer(options);
if (report.summary.result != BuildResult.Succeeded)
{
Debug.LogError($"Build failed: {report.summary.result}");
EditorApplication.Exit(1);
}
}
[MenuItem("YourGame/Build/Build iOS")]
public static void BuildProductiOS()
{
EditorUserBuildSettings.SwitchActiveBuildTarget(
BuildTargetGroup.iOS, BuildTarget.iOS);
PlayerSettings.companyName = "Your Studio";
PlayerSettings.productName = "YourGame";
PlayerSettings.bundleVersion = "1.0.0";
PlayerSettings.iOS.buildNumber = "1";
var scenes = EditorBuildSettings.scenes
.Where(s => s.enabled)
.Select(s => s.path)
.ToArray();
if (scenes.Length == 0)
{
Debug.LogError("No scenes enabled in Build Settings.");
EditorApplication.Exit(1);
return;
}
var options = new BuildPlayerOptions
{
scenes = scenes,
locationPathName = "Builds/iOS",
target = BuildTarget.iOS,
options = BuildOptions.None
};
var report = BuildPipeline.BuildPlayer(options);
if (report.summary.result != BuildResult.Succeeded)
{
Debug.LogError($"Build failed: {report.summary.result}");
EditorApplication.Exit(1);
}
}
}
}

Connecting to the pipeline

The pipeline calls your build method via the UNITY_EXECUTE_METHOD value. In your pipeline values file (Build/Pipeline/values/android/unity.yml), set it to the fully qualified method name:

values:
UNITY_EXECUTE_METHOD: "YourGame.BuildScript.BuildProduct"

For iOS (Build/Pipeline/values/ios/unity.yml):

values:
UNITY_EXECUTE_METHOD: "YourGame.BuildScript.BuildProductiOS"

The pipeline’s UnityCustomBuildStep launches Unity in batch mode with -executeMethod pointing to this value.

Testing locally

You can test your build script from the Unity Editor menu (the [MenuItem] attributes) or from the command line:

Terminal window
# Android
/Applications/Unity/Hub/Editor/6000.0.47f1/Unity.app/Contents/MacOS/Unity \
-batchmode -quit -projectPath /path/to/your/project \
-executeMethod YourGame.BuildScript.BuildProduct
# iOS
/Applications/Unity/Hub/Editor/6000.0.47f1/Unity.app/Contents/MacOS/Unity \
-batchmode -quit -projectPath /path/to/your/project \
-executeMethod YourGame.BuildScript.BuildProductiOS

Important notes

  • Exit code — Always call EditorApplication.Exit(1) on failure. The pipeline detects non-zero exit codes as build failures.
  • Scenes — Ensure your scenes are enabled in Build Settings (File > Build Settings). The build script reads from EditorBuildSettings.scenes.
  • Output path — Android builds produce an .apk file. iOS builds produce an Xcode project directory that the pipeline’s IOSBuildStep processes further.
  • Build options — Use BuildOptions.None for production builds. Use BuildOptions.Development for development builds with debugging enabled.