using System.Diagnostics; using System.Linq; using UnityEngine; using UnityEditor; using UnityEditor.Build.Player; using Debug = UnityEngine.Debug; public static class BuildingUtils { private const string SteamBuildDefine = "STEAM_BUILD"; [MenuItem("Tools/PrepareForBuild", priority = -10)] public static void PrepareForBuild() { var namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup( BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget)); var args = PlayerSettings.GetAdditionalCompilerArguments(namedBuildTarget); var argsList = args.ToList(); argsList.Remove(SteamBuildDefine); PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, argsList.ToArray()); } [MenuItem("Tools/PlatformDefines/Steam", priority = -1)] public static void SetDefinesForSteam() { PrepareForBuild(); var namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup( BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget)); var args = PlayerSettings.GetAdditionalCompilerArguments(namedBuildTarget); var argsList = args.ToList(); argsList.Add(SteamBuildDefine); PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, argsList.ToArray()); } [MenuItem("Tools/Build/Steam/Release")] public static void SteamRelease() { if(!CanBuild()) return; IncreaseBuildNumber(); BuildRelease(); UploadSteam(); } [MenuItem("Tools/Build/Steam/Development")] public static void SteamDevelopment() { if(!CanBuild()) return; IncreaseBuildNumber(); BuildDevelopment(); UploadSteam(); } [MenuItem("Tools/Build/Steam/Demo")] public static void SteamDemo() { if(!CanBuild()) return; IncreaseBuildNumber(); BuildDemo(); UploadSteam(true); } [MenuItem("Tools/Build/All Release")] public static void BuildRelease() { if(!CanBuild()) return; BuildWindowsRelease(); BuildLinuxRelease(); } [MenuItem("Tools/Build/All Development")] public static void BuildDevelopment() { if(!CanBuild()) return; BuildWindowsDevelopment(); } [MenuItem("Tools/Build/All Demo")] public static void BuildDemo() { if(!CanBuild()) return; BuildWindows(true, new[] {"DEMO"}); BuildLinux(true, new[] {"DEMO"}); } [MenuItem("Tools/Build/Platform/Windows/x64-Development")] public static void BuildWindowsDevelopment() { if(!CanBuild()) return; BuildWindows(false); } [MenuItem("Tools/Build/Platform/Windows/x64-Release")] public static void BuildWindowsRelease() { if(!CanBuild()) return; BuildWindows(true); } [MenuItem("Tools/Build/Platform/Linux/x64-Release")] public static void BuildLinuxRelease() { if(!CanBuild()) return; BuildLinux(true); } [MenuItem("Tools/Build/Platform/Android/GooglePlay")] public static void BuildGooglePlay() { IncreaseBuildNumber(); PlayerSettings.Android.bundleVersionCode++; EditorUserBuildSettings.buildAppBundle = true; var buildPlayerOptions = new BuildPlayerOptions { scenes = new string[EditorBuildSettings.scenes.Length] }; for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) { buildPlayerOptions.scenes[i] = EditorBuildSettings.scenes[i].path; } buildPlayerOptions.target = BuildTarget.Android; buildPlayerOptions.options = BuildOptions.None; buildPlayerOptions.locationPathName = Application.dataPath + $"/../../{Application.productName}-GooglePlay/{Application.productName}.aab"; BuildPipeline.BuildPlayer(buildPlayerOptions); } private static void BuildWindows(bool release, string[] additionalDefines = default) { var buildPlayerOptions = new BuildPlayerOptions { scenes = new string[EditorBuildSettings.scenes.Length] }; for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) { buildPlayerOptions.scenes[i] = EditorBuildSettings.scenes[i].path; } buildPlayerOptions.extraScriptingDefines = additionalDefines; buildPlayerOptions.target = BuildTarget.StandaloneWindows64; buildPlayerOptions.options = release ? BuildOptions.None : BuildOptions.Development; buildPlayerOptions.locationPathName = Application.dataPath + $"/../../{Application.productName}-Steam/ContentBuilder/content/windows/{Application.productName}.exe"; BuildPipeline.BuildPlayer(buildPlayerOptions); } private static void BuildLinux(bool release, string[] additionalDefines = default) { var buildPlayerOptions = new BuildPlayerOptions { scenes = new string[EditorBuildSettings.scenes.Length] }; for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) { buildPlayerOptions.scenes[i] = EditorBuildSettings.scenes[i].path; } buildPlayerOptions.extraScriptingDefines = additionalDefines; buildPlayerOptions.target = BuildTarget.StandaloneLinux64; buildPlayerOptions.options = release ? BuildOptions.None : BuildOptions.Development; buildPlayerOptions.locationPathName = Application.dataPath + $"/../../{Application.productName}-Steam/ContentBuilder/content/linux/{Application.productName}.x86_64"; BuildPipeline.BuildPlayer(buildPlayerOptions); } private static void IncreaseBuildNumber() { string[] versionParts = PlayerSettings.bundleVersion.Split('.'); if (versionParts.Length != 3 || !int.TryParse(versionParts[2], out int version)) { Debug.LogError("IncreaseBuildNumber failed to update version " + PlayerSettings.bundleVersion); return; } versionParts[2] = (version + 1).ToString(); PlayerSettings.bundleVersion = string.Join(".", versionParts); } private static void UploadSteam(bool demo = false) { string command = $"cd {Application.dataPath}/../../{Application.productName}-Steam/ContentBuilder && push_build.bat"; if (demo) { command = $"cd {Application.dataPath}/../../{Application.productName}-Steam/ContentBuilder && push_demo.bat"; } var processInfo = new ProcessStartInfo("cmd.exe", $"/c {command}") { CreateNoWindow = true, UseShellExecute = false }; var process = Process.Start(processInfo); process.WaitForExit(); Debug.Log(process.ExitCode); process.Close(); } private static bool CanBuild() { if (CanBuildUtil()) return true; Debug.LogError("Cannot build with defines set in project, please use PrepareForBuild and wait for scripts recompilation"); return false; } private static bool CanBuildUtil() { var namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup( BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget)); var args = PlayerSettings.GetAdditionalCompilerArguments(namedBuildTarget); var argsList = args.ToList(); if (argsList.Contains(SteamBuildDefine)) return false; return true; } }