/// <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
        });
    }