###### tags: `CustomBuildPipline` `Unity` # Custom Build Pipline 使用batch, Build project / addressable assets ## Batch file 1. 需將 Batch file ```editorPath``` 修改為本地 Unity Editor 的路徑 2. Batch file 路徑為專案根目錄 ![](https://i.imgur.com/KpVmf4G.png) 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://i.imgur.com/Ub4kmeg.png) https://forum.unity.com/threads/resolved-standalone-builds-from-command-line-have-incorrect-lighting.1097056/