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:
- Configuring player settings (product name, bundle identifier, version)
- Gathering the scenes to include
- Calling
BuildPipeline.BuildPlayer()with the correct target and output path - Exiting with code
1on 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:
# 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.BuildProductiOSImportant 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 fromEditorBuildSettings.scenes. - Output path — Android builds produce an
.apkfile. iOS builds produce an Xcode project directory that the pipeline’sIOSBuildStepprocesses further. - Build options — Use
BuildOptions.Nonefor production builds. UseBuildOptions.Developmentfor development builds with debugging enabled.