From 7cc8ba6aab54c6c70d3fe208fe07700da9ee1359 Mon Sep 17 00:00:00 2001 From: Jiaqi Liu Date: Sun, 20 Oct 2024 23:24:22 -0700 Subject: [PATCH] v0.77 Add Win-ARM64 support --- .gitignore | 3 + Assets/Scripts/Editor/GameVariantSwitcher.cs | 9 ++ Assets/Scripts/Editor/ReleaseBuildPipeline.cs | 120 ++++++++++++------ ProjectSettings/ProjectSettings.asset | 9 +- 4 files changed, 96 insertions(+), 45 deletions(-) diff --git a/.gitignore b/.gitignore index eb2019aa0..c4474a171 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,9 @@ crashlytics-build.properties # MacOS generated files .DS_Store +# Unity CMake tmp files +.utmp + # Unity StreamingAssets folder /Assets/StreamingAssets diff --git a/Assets/Scripts/Editor/GameVariantSwitcher.cs b/Assets/Scripts/Editor/GameVariantSwitcher.cs index 0499ee2a5..4e93852c2 100644 --- a/Assets/Scripts/Editor/GameVariantSwitcher.cs +++ b/Assets/Scripts/Editor/GameVariantSwitcher.cs @@ -73,6 +73,7 @@ private static void ApplyPlayerSettingsForVariant(string appName) Texture2D gameIcon = Resources.Load(gameIconPath); if (gameIcon == null) throw new Exception($"Game icon not found: {gameIconPath}"); + // Set app icons for all supported build targets foreach (NamedBuildTarget target in SymbolsHelper.GetAllSupportedBuildTargets()) { PlayerSettings.SetApplicationIdentifier(target, @@ -93,6 +94,14 @@ private static void ApplyPlayerSettingsForVariant(string appName) IconKind.Store); } } + + // Set default app icon (I don't know why Unity decided to use NamedBuildTarget.Unknown here but it is what it is) + { + int[] iconSizes = PlayerSettings.GetIconSizes(NamedBuildTarget.Unknown, IconKind.Application); + PlayerSettings.SetIcons(NamedBuildTarget.Unknown, + Enumerable.Repeat(gameIcon, iconSizes.Length).ToArray(), + IconKind.Application); + } } } } \ No newline at end of file diff --git a/Assets/Scripts/Editor/ReleaseBuildPipeline.cs b/Assets/Scripts/Editor/ReleaseBuildPipeline.cs index f87186b65..7f517dac5 100644 --- a/Assets/Scripts/Editor/ReleaseBuildPipeline.cs +++ b/Assets/Scripts/Editor/ReleaseBuildPipeline.cs @@ -15,19 +15,16 @@ namespace Editor using UnityEditor.Build.Reporting; using UnityEngine; - #if UNITY_2020_2_OR_NEWER && UNITY_STANDALONE_OSX - using UnityEditor.OSXStandalone; - #endif - [Flags] public enum Pal3BuildTarget { - Windows_x86 = 1 << 0, - Windows_x64 = 1 << 1, - Linux_x86_x64 = 1 << 2, - macOS_arm64_x64 = 1 << 3, - Android = 1 << 4, - iOS = 1 << 5, + Windows_arm64 = 1 << 0, + Windows_x86 = 1 << 1, + Windows_x64 = 1 << 2, + Linux_x86_x64 = 1 << 3, + macOS_arm64_x64 = 1 << 4, + Android = 1 << 5, + iOS = 1 << 6, } public static class ReleaseBuildPipeline @@ -35,7 +32,17 @@ public static class ReleaseBuildPipeline private static readonly string[] BuildLevels = { "Assets/Scenes/Game.unity" }; private static readonly char DirSeparator = Path.DirectorySeparatorChar; - + + #if PAL3 + [MenuItem("PAL3/Build Pipelines/Build [Windows_arm64] IL2CPP Release Executable")] + #elif PAL3A + [MenuItem("PAL3A/Build Pipelines/Build [Windows_arm64] IL2CPP Release Executable")] + #endif + public static void Build_Windows_arm64() + { + BuildGame(Pal3BuildTarget.Windows_arm64); + } + #if PAL3 [MenuItem("PAL3/Build Pipelines/Build [Windows_x86] IL2CPP Release Executable")] #elif PAL3A @@ -103,7 +110,8 @@ public static void Build_iOS() #endif public static void BuildAll() { - BuildGame(Pal3BuildTarget.Windows_x86 | + BuildGame(Pal3BuildTarget.Windows_arm64 | + Pal3BuildTarget.Windows_x86 | Pal3BuildTarget.Windows_x64 | Pal3BuildTarget.Linux_x86_x64 | Pal3BuildTarget.macOS_arm64_x64 | @@ -133,69 +141,98 @@ private static void BuildGame(Pal3BuildTarget buildTarget) var buildConfigurations = new[] { - new { Platform = Pal3BuildTarget.Windows_x86, Extension = ".exe", NamedTarget = NamedBuildTarget.Standalone, Target = BuildTarget.StandaloneWindows }, - new { Platform = Pal3BuildTarget.Windows_x64, Extension = ".exe", NamedTarget = NamedBuildTarget.Standalone, Target = BuildTarget.StandaloneWindows64 }, - new { Platform = Pal3BuildTarget.Linux_x86_x64, Extension = "", NamedTarget = NamedBuildTarget.Standalone, Target = BuildTarget.StandaloneLinux64 }, - new { Platform = Pal3BuildTarget.macOS_arm64_x64, Extension = "", NamedTarget = NamedBuildTarget.Standalone, Target = BuildTarget.StandaloneOSX }, - new { Platform = Pal3BuildTarget.Android, Extension = ".apk", NamedTarget = NamedBuildTarget.Android, Target = BuildTarget.Android }, - new { Platform = Pal3BuildTarget.iOS, Extension = "", NamedTarget = NamedBuildTarget.iOS, Target = BuildTarget.iOS }, + new { Target = Pal3BuildTarget.Windows_x86, Extension = ".exe", NamedTarget = NamedBuildTarget.Standalone }, + new { Target = Pal3BuildTarget.Windows_x64, Extension = ".exe", NamedTarget = NamedBuildTarget.Standalone }, + new { Target = Pal3BuildTarget.Windows_arm64, Extension = ".exe", NamedTarget = NamedBuildTarget.Standalone }, + new { Target = Pal3BuildTarget.Linux_x86_x64, Extension = "", NamedTarget = NamedBuildTarget.Standalone}, + new { Target = Pal3BuildTarget.macOS_arm64_x64, Extension = "", NamedTarget = NamedBuildTarget.Standalone }, + new { Target = Pal3BuildTarget.Android, Extension = ".apk", NamedTarget = NamedBuildTarget.Android }, + new { Target = Pal3BuildTarget.iOS, Extension = "", NamedTarget = NamedBuildTarget.iOS }, }; - List logActions = new List(); + List logActions = new(); foreach (var config in buildConfigurations) { - if (buildTarget.HasFlag(config.Platform)) + if (buildTarget.HasFlag(config.Target)) { - Build(config.Platform.ToString(), + Build(config.Target, config.Extension, config.NamedTarget, - config.Target, buildOutputPath, logActions); } } - - // Restore build target settings - EditorUserBuildSettings.SwitchActiveBuildTarget(targetGroupBeforeBuild, targetBeforeBuild); - + // Execute report log actions logActions.ForEach(action => action.Invoke()); Debug.Log($"[{nameof(ReleaseBuildPipeline)}] Build for version {PlayerSettings.bundleVersion} complete! Output path: " + $"{buildOutputPath}{GameConstants.AppName}"); + + // Restore build target settings + EditorUserBuildSettings.SwitchActiveBuildTargetAsync(targetGroupBeforeBuild, targetBeforeBuild); } - private static void Build(string folderName, + private static void Build(Pal3BuildTarget target, string extension, NamedBuildTarget namedBuildTarget, - BuildTarget buildTarget, string buildOutputPath, List logActions, bool deletePdbFiles = true) { string outputFolder = buildOutputPath + $"{GameConstants.AppName}{DirSeparator}" + - $"{folderName}{DirSeparator}"; + $"{target.ToString()}{DirSeparator}"; - if (buildTarget is BuildTarget.StandaloneWindows - or BuildTarget.StandaloneWindows64 - or BuildTarget.StandaloneLinux64) - { - outputFolder += $"{GameConstants.AppName}{DirSeparator}"; - } - else if (buildTarget is BuildTarget.StandaloneOSX) + BuildTarget buildTarget = BuildTarget.NoTarget; + + switch (target) { - #if UNITY_2020_2_OR_NEWER && UNITY_STANDALONE_OSX - UserBuildSettings.architecture = OSArchitecture.x64ARM64; - UserBuildSettings.createXcodeProject = true; - #endif + case Pal3BuildTarget.Windows_arm64: + buildTarget = BuildTarget.StandaloneWindows64; + outputFolder += $"{GameConstants.AppName}{DirSeparator}"; + #if UNITY_2020_2_OR_NEWER && UNITY_EDITOR_WIN + UnityEditor.WindowsStandalone.UserBuildSettings.architecture = OSArchitecture.ARM64; + #endif + break; + case Pal3BuildTarget.Windows_x86: + buildTarget = BuildTarget.StandaloneWindows; + outputFolder += $"{GameConstants.AppName}{DirSeparator}"; + #if UNITY_2020_2_OR_NEWER && UNITY_EDITOR_WIN + UnityEditor.WindowsStandalone.UserBuildSettings.architecture = OSArchitecture.x86; + #endif + break; + case Pal3BuildTarget.Windows_x64: + buildTarget = BuildTarget.StandaloneWindows64; + outputFolder += $"{GameConstants.AppName}{DirSeparator}"; + #if UNITY_2020_2_OR_NEWER && UNITY_EDITOR_WIN + UnityEditor.WindowsStandalone.UserBuildSettings.architecture = OSArchitecture.x64; + #endif + break; + case Pal3BuildTarget.Linux_x86_x64: + buildTarget = BuildTarget.StandaloneLinux64; + outputFolder += $"{GameConstants.AppName}{DirSeparator}"; + break; + case Pal3BuildTarget.macOS_arm64_x64: + buildTarget = BuildTarget.StandaloneOSX; + #if UNITY_2020_2_OR_NEWER && UNITY_EDITOR_OSX + UnityEditor.OSXStandalone.UserBuildSettings.architecture = OSArchitecture.x64ARM64; + UnityEditor.OSXStandalone.UserBuildSettings.createXcodeProject = true; + #endif + break; + case Pal3BuildTarget.Android: + buildTarget = BuildTarget.Android; + break; + case Pal3BuildTarget.iOS: + buildTarget = BuildTarget.iOS; + break; } string outputPath = outputFolder + $"{GameConstants.AppName}{extension}"; PlayerSettings.SetScriptingBackend(namedBuildTarget, ScriptingImplementation.IL2CPP); - BuildReport report = BuildPipeline.BuildPlayer(BuildLevels, outputPath, buildTarget, BuildOptions.None); + BuildReport report = BuildPipeline.BuildPlayer(BuildLevels, outputPath, buildTarget, BuildOptions.CleanBuildCache); if (deletePdbFiles) { @@ -250,6 +287,7 @@ private static void ZipReleaseFiles() List<(string FolderPath, Pal3BuildTarget Target)> buildTargets = new() { ($"{GameConstants.AppName}{DirSeparator}{Pal3BuildTarget.Android.ToString()}{DirSeparator}{GameConstants.AppName}.apk", Pal3BuildTarget.Android), + ($"{GameConstants.AppName}{DirSeparator}{Pal3BuildTarget.Windows_arm64.ToString()}", Pal3BuildTarget.Windows_arm64), ($"{GameConstants.AppName}{DirSeparator}{Pal3BuildTarget.Windows_x86.ToString()}", Pal3BuildTarget.Windows_x86), ($"{GameConstants.AppName}{DirSeparator}{Pal3BuildTarget.Windows_x64.ToString()}", Pal3BuildTarget.Windows_x64), ($"{GameConstants.AppName}{DirSeparator}{Pal3BuildTarget.Linux_x86_x64.ToString()}", Pal3BuildTarget.Linux_x86_x64) diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index e9458d381..e596ce8d1 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -140,8 +140,9 @@ PlayerSettings: loadStoreDebugModeEnabled: 0 visionOSBundleVersion: 1.0 tvOSBundleVersion: 1.0 - bundleVersion: 0.75 - preloadedAssets: [] + bundleVersion: 0.77 + preloadedAssets: + - {fileID: 11400000, guid: d36b5fde9d421c74cba9317a109723a2, type: 2} metroInputSource: 0 wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1 @@ -302,7 +303,7 @@ PlayerSettings: - m_BuildTarget: m_Icons: - serializedVersion: 2 - m_Icon: {fileID: 0} + m_Icon: {fileID: 2800000, guid: 6b32649dccc45df4ebe8e3f8eccee249, type: 3} m_Width: 128 m_Height: 128 m_Kind: 0 @@ -667,7 +668,7 @@ PlayerSettings: m_APIs: 1500000011000000 m_Automatic: 0 - m_BuildTarget: WindowsStandaloneSupport - m_APIs: 020000001500000012000000 + m_APIs: 0200000015000000 m_Automatic: 0 m_BuildTargetVRSettings: - m_BuildTarget: Standalone