using System; using UnityEditor; namespace Game.EditorUtility { public enum BuildType { Mono, IL2CPP } public static class QuickChangeBuildTypeMenu { public static event Action OnBuildTypeChanged; private const int MENU_ITEM_PRIORITY = -1; private const string PATH_MENU_MONO = "Help/Quick change build type/Mono"; private const string PATH_MENU_IL2CPP = "Help/Quick change build type/IL2CPP"; [MenuItem(PATH_MENU_MONO, true)] private static bool ValidateChangeToMonoBuildMenu() { if (EditorApplication.isPlaying) { return false; } bool shouldCheckedMenu = IsUseCurrentBuildType(BuildType.Mono); Menu.SetChecked(PATH_MENU_MONO, isChecked: shouldCheckedMenu); return true; } [MenuItem(PATH_MENU_IL2CPP, true)] private static bool ValidateChangeToIL2CPPBuildMenu() { if (EditorApplication.isPlaying) { return false; } bool shouldCheckedMenu = IsUseCurrentBuildType(BuildType.IL2CPP); Menu.SetChecked(PATH_MENU_IL2CPP, isChecked: shouldCheckedMenu); return true; } [MenuItem(PATH_MENU_MONO, false, MENU_ITEM_PRIORITY)] private static void ChangeToMonoBuildMenu() { ChangeBuildType(BuildType.Mono); } [MenuItem(PATH_MENU_IL2CPP, false, MENU_ITEM_PRIORITY)] private static void ChangeToIL2CPPBuildMenu() { ChangeBuildType(BuildType.IL2CPP); } private static void ChangeBuildType(BuildType buildType) { BuildTargetGroup currentBuildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; switch (buildType) { case BuildType.Mono: { PlayerSettings.SetScriptingBackend(currentBuildTargetGroup, ScriptingImplementation.Mono2x); PlayerSettings.SetManagedStrippingLevel(currentBuildTargetGroup, ManagedStrippingLevel.Disabled); AssetDatabase.SaveAssets(); } break; case BuildType.IL2CPP: { PlayerSettings.SetScriptingBackend(currentBuildTargetGroup, ScriptingImplementation.IL2CPP); PlayerSettings.SetManagedStrippingLevel(currentBuildTargetGroup, ManagedStrippingLevel.Minimal); AssetDatabase.SaveAssets(); } break; } OnBuildTypeChanged?.Invoke(); } private static bool IsUseCurrentBuildType(BuildType buildType) { BuildTargetGroup currentBuildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; ScriptingImplementation currentScriptingImplementation = PlayerSettings.GetScriptingBackend(currentBuildTargetGroup); return buildType switch { BuildType.Mono => (currentScriptingImplementation == ScriptingImplementation.Mono2x), BuildType.IL2CPP => (currentScriptingImplementation == ScriptingImplementation.IL2CPP), _ => false }; } } }