Пример #1
0
        /// <summary>
        /// Set up a Unity build started using the build player window.
        /// </summary>
        static void UnityDefaultBuild(ref BuildPlayerOptions options)
        {
            BuildType = TrimmerBuildType.BuildWindow;

            currentProfile = EditorProfile.Instance.ActiveProfile;

            AddScriptingDefineSymbols(currentProfile, ref options);

            OptionHelper.currentBuildOptions = options;
        }
Пример #2
0
        /// <summary>
        /// Set up a non-Trimmer build.
        /// </summary>
        static void NonTrimmerBuild(BuildTarget target)
        {
            BuildType = TrimmerBuildType.NonTrimmer;

            Debug.LogWarning($"Trimmer: Build started using a unsupported method, some Trimmer features will not work.");

            currentProfile = EditorProfile.Instance.ActiveProfile;

            // We can only react when the build has already started and cannot
            // edit BuildPlayerOptions.extraScriptingDefines, so we have to
            // change PlayerSettings.
            ApplyScriptingDefineSymbolsToPlayerSettings(currentProfile, target);

            OptionHelper.currentBuildOptions = default;
        }
Пример #3
0
        /// <summary>
        /// Build a profile with the given build options, synchronously starting the build.
        /// </summary>
        /// <remarks>
        /// The `BuildPlayerOptions` will be passed through the profile's Options'
        /// <see cref="Option.PrepareBuild"/>, which can modify it before the build is started.
        ///
        /// > [!NOTE]
        /// > If you do not set `options.locationPathName` and no option sets
        /// > it in the `PrepareBuild` callback, then a save dialog will be shown.
        ///
        /// > [!WARNING]
        /// > With this method it's possible to build for a build target even if this
        /// > target is not the active build target. This can lead to issues where
        /// > build code for the given target is not run.
        /// </remarks>
        public static BuildReport BuildSync(BuildProfile buildProfile, BuildPlayerOptions options)
        {
            // Prepare build
            BuildType      = TrimmerBuildType.Profile;
            currentProfile = buildProfile;

            // Add Trimmer scripting define symbols
            AddScriptingDefineSymbols(buildProfile, ref options);

            // Run options' PrepareBuild
            foreach (var option in GetCurrentEditProfile().OrderBy(o => o.PostprocessOrder))
            {
                if ((option.Capabilities & OptionCapabilities.ConfiguresBuild) == 0)
                {
                    continue;
                }
                var inclusion = buildProfile == null ? OptionInclusion.Remove : buildProfile.GetInclusionOf(option, options.target);
                options = option.PrepareBuild(options, inclusion);
            }

            // Ask for location if none has been set
            if (string.IsNullOrEmpty(options.locationPathName))
            {
                if (Application.isBatchMode)
                {
                    // Cannot pick path in batch mode
                    throw new Exception($"Trimmer: No build path set by profile or in build player options.");
                }
                else
                {
                    options.locationPathName = PickBuildLocation(options.target);
                    if (string.IsNullOrEmpty(options.locationPathName))
                    {
                        Debug.Log("Cancelled build location dialog");
                        return(null);
                    }
                }
            }

            // Make sure the path has the right extension
            // Call internal method:
            // string PostprocessBuildPlayer.GetExtensionForBuildTarget(BuildTargetGroup targetGroup, BuildTarget target, BuildOptions options)
            var PostprocessBuildPlayer = typeof(BuildPipeline).Assembly.GetType("UnityEditor.PostprocessBuildPlayer");

            if (PostprocessBuildPlayer == null)
            {
                Debug.LogWarning("Could not find PostprocessBuildPlayer to determine build file extension.");
            }
            else
            {
                var GetExtensionForBuildTarget = PostprocessBuildPlayer.GetMethod("GetExtensionForBuildTarget", BindingFlags.Public | BindingFlags.Static);
                if (GetExtensionForBuildTarget == null)
                {
                    Debug.LogWarning("Could not find GetExtensionForBuildTarget to determine build file extension.");
                }
                else
                {
                    var args = new object[] { options.targetGroup, options.target, options.options };
                    var ext  = (string)GetExtensionForBuildTarget.Invoke(null, args);

                    var current = Path.GetExtension(options.locationPathName);
                    if (current.Length > 0)
                    {
                        current = current.Substring(1); // Remove leading dot
                    }

                    if (!string.IsNullOrEmpty(ext) &&
                        Path.GetExtension(options.locationPathName).EqualsIgnoringCase(current))
                    {
                        options.locationPathName += "." + ext;
                    }
                }
            }

            // Run the build
            OptionHelper.currentBuildOptions = options;

            var report = BuildPipeline.BuildPlayer(options);

            if (report.summary.result != BuildResult.Succeeded)
            {
                OnBuildError(report);
            }
            else
            {
                Debug.Log(string.Format("Trimmer: Built {0} to '{1}'", options.target, options.locationPathName));
                buildProfile.SetLastBuildPath(options.target, options.locationPathName);
            }

            currentProfile = null;
            OptionHelper.currentBuildOptions = default;
            return(report);
        }
Пример #4
0
        /// <summary>
        /// Entry point for Unity Cloud builds.
        /// </summary>
        /// <remarks>
        /// If you don't configure anything, Unity Cloud Build will build without a
        /// profile, all Options will use their default value and will be removed.
        ///
        /// Add the name of the Build Profile you want to build with to the target name
        /// in Unity Cloud Build, enclosed in double underscores, e.g. `__Profile Name__`.
        /// Note that since the target name can contain only alphanumeric characters,
        /// spaces, dashes and underscores, those characters cannot appear in the profile
        /// name either.
        ///
        /// Also note that the ability for Options to set build options is limited,
        /// currently only setting a custom  scene list is supported.
        /// </remarks>
        public static void UnityCloudBuild(BuildManifestObject manifest)
        {
            BuildType = TrimmerBuildType.CloudBuild;

            Debug.Log("UnityCloudBuild: Parsing profile name...");

            // Get profile name from could build target name
            string targetName;

            if (!manifest.TryGetValue("cloudBuildTargetName", out targetName))
            {
                Debug.LogError("Could not get target name from cloud build manifest.");
            }
            else
            {
                var match = Regex.Match(targetName, @"__([\w\-. ]+)__");
                if (match.Success)
                {
                    targetName = match.Groups[1].Value;
                    Debug.Log("Parsed build profile name from target name: " + targetName);
                }
            }

            Debug.Log("UnityCloudBuild: Looking for profile...");

            BuildProfile buildProfile = null;

            if (!string.IsNullOrEmpty(targetName))
            {
                buildProfile = BuildProfile.Find(targetName);
                if (buildProfile == null)
                {
                    Debug.LogError("Build Profile named '" + targetName + "' could not be found.");
                    return;
                }
            }

            if (buildProfile == null)
            {
                Debug.LogWarning("No Build Profile selected. Add the Build Profile enclosed in double underscores (__) to the target name.");
                return;
            }

            Debug.Log("UnityCloudBuild: Running PrepareBuild callbacks...");

            // Prepare build
            var options = GetDefaultOptions(EditorUserBuildSettings.activeBuildTarget);

            currentProfile = buildProfile;

            // Run options' PrepareBuild
            foreach (var option in GetCurrentEditProfile().OrderBy(o => o.PostprocessOrder))
            {
                if ((option.Capabilities & OptionCapabilities.ConfiguresBuild) == 0)
                {
                    continue;
                }
                var inclusion = buildProfile == null ? OptionInclusion.Remove : buildProfile.GetInclusionOf(option, options.target);
                options = option.PrepareBuild(options, inclusion);
            }

            // Cloud Build doesn't allow changing BuildPlayerOptions.extraScriptingDefines,
            // so we have to apply scripting define symbols to player settings
            ApplyScriptingDefineSymbolsToPlayerSettings(buildProfile, options.target);

            Debug.Log("UnityCloudBuild: Apply scenes...");

            // Apply scenes
            if (options.scenes != null && options.scenes.Length > 0)
            {
                var scenes = new EditorBuildSettingsScene[options.scenes.Length];
                for (int i = 0; i < scenes.Length; i++)
                {
                    scenes[i] = new EditorBuildSettingsScene(
                        options.scenes[i],
                        true
                        );
                }
                EditorBuildSettings.scenes = scenes;
            }

            OptionHelper.currentBuildOptions = options;
            Debug.Log("UnityCloudBuild: Done!");
        }