using System; using System.IO; using UnityEditor; using UnityEditor.Build; using UnityEngine; namespace SingularityGroup.HotReload.Editor { internal static class HotReloadBuildHelper { /// /// Should HotReload runtime be included in the current build? /// public static bool IncludeInThisBuild() { return IsAllBuildSettingsSupported(); } /// /// Get scripting backend for the current platform. /// /// Scripting backend public static ScriptingImplementation GetCurrentScriptingBackend() { #pragma warning disable CS0618 return PlayerSettings.GetScriptingBackend(BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget)); #pragma warning restore CS0618 } public static ManagedStrippingLevel GetCurrentStrippingLevel() { #pragma warning disable CS0618 return PlayerSettings.GetManagedStrippingLevel(BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget)); #pragma warning restore CS0618 } public static void SetCurrentScriptingBackend(ScriptingImplementation to) { #pragma warning disable CS0618 // only set it if default is not correct (avoid changing ProjectSettings when not needed) if (GetCurrentScriptingBackend() != to) { PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup, to); } #pragma warning restore CS0618 } public static void SetCurrentStrippingLevel(ManagedStrippingLevel to) { #pragma warning disable CS0618 // only set it if default is not correct (avoid changing ProjectSettings when not needed) if (GetCurrentStrippingLevel() != to) { PlayerSettings.SetManagedStrippingLevel(EditorUserBuildSettings.selectedBuildTargetGroup, to); } #pragma warning restore CS0618 } /// Is the current build target supported? /// main thread only public static bool IsBuildTargetSupported() { var buildTarget = EditorUserBuildSettings.selectedBuildTargetGroup; return Array.IndexOf(unsupportedBuildTargets, buildTarget) == -1; } /// Are all the settings supported? /// main thread only static bool IsAllBuildSettingsSupported() { if (!IsBuildTargetSupported()) { return false; } // need way to give it settings object, dont want to give serializedobject var options = HotReloadSettingsEditor.LoadSettingsOrDefault(); var so = new SerializedObject(options); // check all projeect options foreach (var option in HotReloadSettingsTab.allOptions) { var projectOption = option as ProjectOptionBase; if (projectOption != null) { // if option is required, build can't use hot reload if (projectOption.IsRequiredForBuild() && !projectOption.GetValue(so)) { return false; } } } return GetCurrentScriptingBackend() == ScriptingImplementation.Mono2x && GetCurrentStrippingLevel() == ManagedStrippingLevel.Disabled && EditorUserBuildSettings.development; } /// /// Some platforms are not supported because they don't have Mono scripting backend. /// /// /// Only list the platforms that definately don't have Mono scripting. /// private static readonly BuildTargetGroup[] unsupportedBuildTargets = new [] { BuildTargetGroup.iOS, // mono support was removed many years ago BuildTargetGroup.WebGL, // has never had mono }; #pragma warning disable CS0618 public static bool IsMonoSupported(BuildTargetGroup buildTarget) { var backend = PlayerSettings.GetScriptingBackend(buildTarget); try { // GetDefaultScriptingBackend returns IL2CPP for Unity 6 which goes against Unity documentation. // Have to use a workaround approach instead PlayerSettings.SetScriptingBackend(buildTarget, ScriptingImplementation.Mono2x); return PlayerSettings.GetScriptingBackend(buildTarget) == ScriptingImplementation.Mono2x; } catch { return false; } finally { PlayerSettings.SetScriptingBackend(buildTarget, backend); } } #pragma warning restore CS0618 } }