###### tags: `CustomBuildPipline` `Unity`
# Custom Build Pipline
使用batch, Build project / addressable assets
## Batch file
1. 需將 Batch file ```editorPath``` 修改為本地 Unity Editor 的路徑
2. Batch file 路徑為專案根目錄

3. Batch file 會產生 stdout 紀錄 Build log
* Build project
呼叫 Unity 專案中的ExpoStudio.BuildProject
```
set mypath=%~dp0
set editorPath="C:\Program Files\Unity\Hub\Editor\2020.3.32f1\Editor\Unity.exe"
@rem Build project
%editorPath% -quit -batchmode -logFile stdout.log -projectPath %mypath% -executeMethod ExpoStudio.BuildProject
```
* Build bundle
呼叫 Unity 專案中的ExpoStudio.BuildContentAndPlayer
```
set mypath=%~dp0
set editorPath="C:\Program Files\Unity\Hub\Editor\2020.3.32f1\Editor\Unity.exe"
@rem Build AA
%editorPath% -quit -batchmode -logFile stdout.log -projectPath %mypath% -executeMethod BatchBuild.BuildContentAndPlayer
```
## Unity Sample
* Build Peoject
```
#if UNITY_EDITOR
using System;
using System.IO;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.AddressableAssets;
using Unity.EditorCoroutines.Editor;
public class ExpoStudio : EditorWindow
{
public static string ExportPath = "C:\\Users\\john.tc.tsai\\Desktop\\output\\webgl\\";
[MenuItem("Studio/Build Project")]
public static void BuildProject()
{
Debug.Log("[Build Project]");
// Get filename.
//string outpath = EditorUtility.SaveFolderPanel("WebGL", "C:\\Users\\COMPALDEV\\Desktop\\output\\", "webgl");
string[] levels = new string[] { "Assets/Scenes/Studio.unity" };
// Build player.
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = levels;
buildPlayerOptions.target = BuildTarget.WebGL;
buildPlayerOptions.locationPathName = ExportPath;
buildPlayerOptions.options = BuildOptions.None;
BuildPipeline.BuildPlayer(buildPlayerOptions);
Debug.Log($"<color=green>[Build success!]</color>");
// Copy a file from the project folder to the build folder, alongside the built game.
FileUtil.CopyFileOrDirectory("Assets/Build/htaccess", ExportPath + "Build\\.htaccess");
}
}
#endif
```
* Build Addressable assets
```
#if UNITY_EDITOR
using System;
using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.Build.Reporting;
using UnityEngine;
public class BatchBuild
{
public static string build_script
= "Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset";
public static string profile_name = "000webhost_aa";
public static void ChangeSettings()
{
string defines = "";
string[] args = Environment.GetCommandLineArgs();
foreach (var arg in args)
if (arg.StartsWith("-defines=", System.StringComparison.CurrentCulture))
defines = arg.Substring(("-defines=".Length));
var buildSettings = EditorUserBuildSettings.selectedBuildTargetGroup;
PlayerSettings.SetScriptingDefineSymbolsForGroup(buildSettings, defines);
}
public static void BuildContentAndPlayer()
{
AddressableAssetSettings settings
= AddressableAssetSettingsDefaultObject.Settings;
settings.activeProfileId
= settings.profileSettings.GetProfileId(profile_name);
IDataBuilder builder
= AssetDatabase.LoadAssetAtPath<ScriptableObject>(build_script) as IDataBuilder;
settings.ActivePlayerDataBuilderIndex
= settings.DataBuilders.IndexOf((ScriptableObject)builder);
AddressableAssetSettings.BuildPlayerContent(out AddressablesPlayerBuildResult result);
if (!string.IsNullOrEmpty(result.Error))
throw new Exception(result.Error);
//BuildReport buildReport
// = BuildPipeline.BuildPlayer(EditorBuildSettings.scenes,
// "d:/build/winApp.exe", EditorUserBuildSettings.activeBuildTarget,
// BuildOptions.None);
//if (buildReport.summary.result != BuildResult.Succeeded)
// throw new Exception(buildReport.summary.ToString());
}
}
#endif
```
## Issue
* 若發現使用 CMD Build Project, Light 無法正常運作時, 請在 Lighting Settings 指定自訂的 Light Setting

https://forum.unity.com/threads/resolved-standalone-builds-from-command-line-have-incorrect-lighting.1097056/