using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; namespace Pumkin.Dependencies { [InitializeOnLoad] public static class ScriptDefinesManager { /// /// Adds define strings to 'Edit > Project Settings > Player > Scripting Define Symbols' for the currently selected platform /// /// New defines to add public static void AddDefinesIfMissing(params string[] newDefines) { AddDefinesIfMissing(EditorUserBuildSettings.selectedBuildTargetGroup, newDefines); } /// /// Removes define strings from 'Edit > Project Settings > Player > Scripting Define Symbols' for the currently selected platform /// /// Defines to remove from the current build target public static void RemoveDefines(params string[] definesToRemove) { RemoveDefines(EditorUserBuildSettings.selectedBuildTargetGroup, definesToRemove); } /// /// Checks if define is set for the currently selected build target /// /// String to check for public static bool IsDefined(string defineString) { return IsDefined(EditorUserBuildSettings.selectedBuildTargetGroup, defineString); } /// /// Adds define strings to 'Edit > Project Settings > Player > Scripting Define Symbols' for the given platform /// /// Build target to add defines for. Different for every platform /// New defines to add public static void AddDefinesIfMissing(BuildTargetGroup buildTarget, params string[] newDefines) { bool definesChanged = false; string existingDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTarget); HashSet defineSet = new HashSet(); if(existingDefines.Length > 0) defineSet = new HashSet(existingDefines.Split(';')); foreach(string def in newDefines) if(defineSet.Add(def)) definesChanged = true; if(definesChanged) { string finalDefineString = string.Join(";", defineSet.ToArray()); PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTarget, finalDefineString); Debug.LogFormat("Set Scripting Define Symbols for selected build target ({0}) to: {1}", buildTarget.ToString(), finalDefineString); } } /// /// Removes define strings from 'Edit > Project Settings > Player > Scripting Define Symbols' for the given platform /// /// Build target to remove defines for. Different for every platform /// Defines to remove from selected build target public static void RemoveDefines(BuildTargetGroup buildTarget, params string[] definesToRemove) { string existingDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTarget); if(existingDefines.Length == 0) return; HashSet defineSet = new HashSet(existingDefines.Split(';')); bool removedSomething = false; foreach(string def in definesToRemove) { if(defineSet.Remove(def)) removedSomething = true; } if(!removedSomething) return; string finalDefineString = string.Join(";", defineSet.ToArray()); PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTarget, finalDefineString); Debug.LogFormat("Set Scripting Define Symbols for selected build target ({0}) to: {1}", buildTarget.ToString(), finalDefineString); } /// /// Checks if define is set for given build target /// /// Build target to check define for /// String to check for public static bool IsDefined(BuildTargetGroup buildTarget, string defineString) { string existingDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTarget); List splitDefines = existingDefines.Split(';').ToList(); if(splitDefines != null && splitDefines.Count > 0) if(splitDefines.Contains(defineString)) return true; return false; } /// /// Returns currently set defines for the given build target as an array split by ';' /// /// Selected build target public static string[] GetDefinesAsArray(BuildTargetGroup buildTarget) { return PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTarget).Split(';'); } /// /// Returns currently set defines for the currently selected build target as an array split by ';' /// public static string[] GetDefinesAsArray() { return PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup).Split(';'); } } }