Пример #1
0
        public static void BuildMacOs()
        {
            var p = new BuilderParams();

            p.targetGroup       = BuildTargetGroup.Standalone;
            p.target            = BuildTarget.StandaloneOSX;
            p.completionMessage = "mac build complete";
            p.suffix            = "-OSX";
            p.platformText      = "Mac";
            Build(p);
        }
Пример #2
0
        public static void BuildWindows()
        {
            var p = new BuilderParams();

            p.targetGroup       = BuildTargetGroup.Standalone;
            p.target            = BuildTarget.StandaloneWindows64;
            p.completionMessage = "windows build complete";
            p.suffix            = "-Win64";
            p.platformText      = "Windows";
            Build(p);
        }
Пример #3
0
        static void Build(BuilderParams parms)
        {
            var cfg       = ConfigurationModel.Config;
            var startTime = DateTime.Now;
            var scenes    = GetScenes();

            ProcessChanges();
            EnableScenes(scenes);

            var title     = cfg.Title;
            var buildName = title + parms.suffix;
            var appName   = title;

            // Ensure the build folder exists
            var projectFolder = Path.Combine(Path.Combine(UnityEngine.Application.dataPath, ".."), "..");
            var buildFolder   = Path.Combine(projectFolder, buildName);
            var buildPath     = Path.Combine(buildFolder, appName);

            Debug.Log("build folder is " + buildFolder);
            Debug.Log("build path is " + buildPath);

            var mode = cfg.Mode.ToString();

            switch (parms.target)
            {
            case BuildTarget.Android:
                buildPath = string.Format("{0}-{1}-{2}{3}.apk", buildPath, cfg.Version, mode, parms.suffix);
                break;

            case BuildTarget.StandaloneWindows64:
            case BuildTarget.StandaloneWindows:
                buildPath = buildPath + ".exe";
                break;

            case BuildTarget.StandaloneOSX:
                buildPath = buildPath + ".app";
                break;

            default:
                break;
            }


            var sceneText = "\n\nScenes:\n• " + string.Join("\n• ", scenes.Select(s => Path.GetFileNameWithoutExtension(s)).ToArray());

            var additionalText = "";

            if (parms.target == BuildTarget.iOS)
            {
                additionalText = "\n\nClose project in XCode!";
            }


            // oh hey this is important info about Android debug signing keys
            // https://productforums.google.com/forum/#!msg/play/xm3h6Crq8lY/IOWg88XhAgAJ

            // see also
            // https://github.com/playgameservices/play-games-plugin-for-unity/issues/1871

            if (parms.target == BuildTarget.Android)
            {
                if (parms.debugSigning)
                {
                    additionalText = "\n\nDebug signing key will be used.";

                    PlayerSettings.Android.keystoreName = "Keychain/debug.keystore";
                    PlayerSettings.Android.keyaliasName = "androiddebugkey";
                    PlayerSettings.Android.keystorePass = "******";
                    PlayerSettings.Android.keyaliasPass = "******";
                    PlayerSettings.keystorePass         = "******";
                    PlayerSettings.keyaliasPass         = "******";
                }
                else
                {
                    additionalText = "\n\nRelease signing key will be used.";

                    PlayerSettings.Android.keystoreName = "Keychain/release.keystore";
                    PlayerSettings.Android.keyaliasName = "releasekey";
                    PlayerSettings.Android.keystorePass = "******";
                    PlayerSettings.Android.keyaliasPass = "******";
                    PlayerSettings.keystorePass         = "******";
                    PlayerSettings.keyaliasPass         = "******";
                }

                if (parms.bundle)
                {
                    additionalText += "\n\nAn .aab bundle will be built for Google Play distribution.";
                }
                else
                {
                    additionalText += "\n\nAn ARM7 APK will be built for sideloading or UDP distribution.";
                }
            }

            // In automatic mode, skip the confirmation dialog
            if (!parms.automatic)
            {
                if (cfg.mode == ConfigurationMode.Release)
                {
                    var confirm = EditorUtility.DisplayDialog("Release Build", "Are you ready to make a release build?", "Yes", "No");

                    if (!confirm)
                    {
                        return;
                    }
                }
                var dlgTitle = string.Format("Build {0} ({1})", title, cfg.Mode);
                var dlgBody  = string.Format("Build {0} {1} for {2} ({3})", title, cfg.Version, parms.platformText, cfg.Mode);
                var proceed  = EditorUtility.DisplayDialog(dlgTitle, dlgBody + sceneText + additionalText, "Build", "Cancel");

                if (!proceed)
                {
                    return;
                }
            }

            // Only switch build targets once dev has confirmed the build!
            EditorUserBuildSettings.SwitchActiveBuildTarget(parms.targetGroup, parms.target);

            BuildOptions options;

            switch (unityBuildType.ToLower())
            {
            case "debug":
                options = BuildOptions.Development | BuildOptions.AllowDebugging | BuildOptions.SymlinkLibraries;
                break;

            default:
                options = BuildOptions.SymlinkLibraries;
                break;
            }

            if (parms.target == BuildTarget.Android)
            {
                // Gradle me
                EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
                //options |= BuildOptions.AcceptExternalModificationsToPlayer;

                if (parms.bundle)
                {
                    // Build ARM64 + ARM32 platforms into an .AAB bundle; requires IL2CPP
                    PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARM64 | AndroidArchitecture.ARMv7;
                    PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.IL2CPP);
                    EditorUserBuildSettings.buildAppBundle = true;
                }
                else
                {
                    // Build just an ARM7 APK using mono back end instead of IL2CPP;
                    // much faster for testing
                    PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARMv7;
                    PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.Mono2x);
                    EditorUserBuildSettings.buildAppBundle = false;
                }

                PlayerSettings.Android.renderOutsideSafeArea = true;
            }

            System.IO.Directory.CreateDirectory(buildFolder);

            var report = BuildPipeline.BuildPlayer(scenes, Path.GetFullPath(buildPath), parms.target, options);

            var reportText = report.summary.result.ToString();

            if (!string.IsNullOrEmpty(reportText))
            {
                reportText = ": " + reportText + " ";
            }

            var elapsedTime = DateTime.Now - startTime;
            var minutes     = elapsedTime.Minutes;
            var seconds     = elapsedTime.Seconds;

            Debug.LogFormat("Build {0} - {1}: process complete at {2} {3}",
                            title,
                            parms.target.ToString(),
                            DateTime.Now.ToString(),
                            reportText);

            Debug.LogFormat("Build elapsed time {0}:{1:00}", minutes, seconds);


    #if UNITY_EDITOR_OSX
            Process say = new Process();
            say.StartInfo.FileName    = "say";
            say.StartInfo.Arguments   = parms.completionMessage;
            say.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            say.Start();
    #else
            EditorApplication.Beep();
    #endif

            // if there's a post-build action configured,
            // like starting another build, do it.
            if (parms.postBuild != null)
            {
                parms.postBuild();
            }
        }
Пример #4
0
 public BuilderParamsTests()
 {
     _target = new BuilderParams();
 }