/// <summary> /// Parse custom command line build arguments /// </summary> public static void ParseBuildCommandLine(ref CustomBuildInfo buildInfo) { string[] arguments = Environment.GetCommandLineArgs(); for (int i = 0; i < arguments.Length; ++i) { switch (arguments[i]) { case "-pc": buildInfo.CustomType = CustomBuildType.PC; break; case "-hololens1": buildInfo.CustomType = CustomBuildType.HoloLens1; break; case "-hololens2": buildInfo.CustomType = CustomBuildType.HoloLens2_ARM64; break; case "-buildOutput": buildInfo.OutputDirectory = arguments[++i]; break; } } }
private async void BuildAppx(CustomBuildInfo customAppxBuildInfo) { bool appxSuccess = false; try { EditorUtility.DisplayProgressBar("Creating AppX", "Compiling, Linking, and Packaging...", 0.9f); // Add "<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>Warning</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>" to work around ARM64 MSBUILD bug AddGlobalProperties(customAppxBuildInfo.OutputDirectory, PlayerSettings.productName, new (string, string)[] {
private async Task BuildPlayer(CustomBuildInfo customBuildInfo) { await UwpPlayerBuildTools.BuildPlayer(new UwpBuildInfo { OutputDirectory = customBuildInfo.OutputDirectory, Scenes = customBuildInfo.Scenes, PostBuildAction = (innerBuildInfo, buildReport) => { if (customBuildInfo.PostBuildAction != null) { customBuildInfo.PostBuildAction(buildReport); } } }); }
private async Task BuildUnityPlayer(CustomBuildInfo info) { if (m_building) { return; } m_building = true; try { await ExecuteBuild(info); } finally { m_building = false; } }
/// <summary> /// Start a build using Unity's command line. /// </summary> public static async void StartCommandLineBuild() { // We don't need stack traces on all our logs. Makes things a lot easier to read. Application.SetStackTraceLogType(LogType.Log, StackTraceLogType.None); // default to HoloLens2 var customBuildInfo = new CustomBuildInfo() { CustomType = CustomBuildType.HoloLens2_ARM32, Silent = true, AutoBuildAppx = true, OutputDirectory = "" }; // parse command line arguments ParseBuildCommandLine(ref customBuildInfo); Debug.LogFormat("Starting command line build for application ({0})...", customBuildInfo.CustomType); EditorAssemblyReloadManager.LockReloadAssemblies = true; bool success = false; try { UnityPlayerBuildTools.SyncSolution(); await s_instance.BuildUnityPlayer(customBuildInfo); } catch (Exception e) { Debug.LogFormat(LogType.Error, LogOption.NoStacktrace, null, $"Build Failed!\n{e.Message}\n{e.StackTrace}"); success = false; } Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, $"Exiting command line build... Build success? {success}"); EditorApplication.Exit(success ? 0 : 1); }
private async Task ExecuteBuild(CustomBuildInfo customBuildInfo) { if (!ValidateSceneCount()) { return; } if (!customBuildInfo.AutoBuildAppx && !customBuildInfo.Silent) { customBuildInfo.AutoBuildAppx = EditorUtility.DisplayDialog(PlayerSettings.productName, "Would you like to create an Appx package?", "Yes", "No"); } if (string.IsNullOrEmpty(customBuildInfo.OutputDirectory) && !customBuildInfo.Silent) { customBuildInfo.OutputDirectory = SelectBuildDirectory(customBuildInfo.CustomType); } if (string.IsNullOrEmpty(customBuildInfo.OutputDirectory)) { return; } // For PC version, make sure there is a "none" VR SDK string[] oldSDKs = PlayerSettings.GetVirtualRealitySDKs(BuildTargetGroup.WSA); if (IsPCBuild(customBuildInfo.CustomType) && !oldSDKs.Contains("None")) { string[] newSDKs = new string[oldSDKs.Length + 1]; newSDKs[0] = "None"; oldSDKs.CopyTo(newSDKs, 1); PlayerSettings.SetVirtualRealitySDKs(BuildTargetGroup.WSA, newSDKs); } // Make sure we're using instancing PlayerSettings.stereoRenderingPath = StereoRenderingPath.Instancing; // Post build actions void PostBuildAction(BuildReport buildReport) { PlayerSettings.SetVirtualRealitySDKs(BuildTargetGroup.WSA, oldSDKs); if (buildReport.summary.result != BuildResult.Succeeded) { EditorUtility.DisplayDialog($"{PlayerSettings.productName} Unity Build {buildReport.summary.result}!", "See console for failure details.", "OK"); } else if (customBuildInfo.AutoBuildAppx || !EditorUtility.DisplayDialog(PlayerSettings.productName, "Unity build completed successfully.", "OK", "Build AppX")) { BuildAppx(new CustomBuildInfo() { CustomType = customBuildInfo.CustomType, RebuildAppx = false, Configuration = CustomBuildConfiguration.Master.ToString(), BuildPlatform = ToBuildPlatform(customBuildInfo.CustomType).ToString(), OutputDirectory = customBuildInfo.OutputDirectory, AutoIncrement = BuildDeployPreferences.IncrementBuildVersion, }); } } await BuildPlayer(new CustomBuildInfo { CustomType = customBuildInfo.CustomType, OutputDirectory = customBuildInfo.OutputDirectory, BuildPlatform = ToBuildPlatform(customBuildInfo.CustomType).ToString(), Scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(scene => scene.path), PostBuildAction = PostBuildAction }); }