58 if (
string.IsNullOrWhiteSpace(define))
61#if UNITY_2021_2_OR_NEWER
62 var named = GetActiveNamedBuildTarget();
63 PlayerSettings.GetScriptingDefineSymbols(named, out var defines);
64 return defines.Any(d =>
string.Equals(d, define, StringComparison.Ordinal));
67 var group = EditorUserBuildSettings.selectedBuildTargetGroup;
68 var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(group);
69 var list = defines.Split(
new[] {
';' }, StringSplitOptions.RemoveEmptyEntries);
70 return list.Any(d =>
string.Equals(d, define, StringComparison.Ordinal));
82 if (
string.IsNullOrWhiteSpace(activeDefine) || exclusiveDefines ==
null)
85 var exclusiveSet =
new HashSet<string>(
86 exclusiveDefines.Where(define => !
string.IsNullOrWhiteSpace(define)),
87 StringComparer.Ordinal);
89 if (!exclusiveSet.Contains(activeDefine))
90 throw new ArgumentException(
"The active define must be included in the exclusive define set.", nameof(activeDefine));
92#if UNITY_2021_2_OR_NEWER
93 var selected = GetActiveNamedBuildTarget();
94 var changedOnSelected = SetExclusiveOn(selected, activeDefine, exclusiveSet);
96 foreach (var target
in new[] { NamedBuildTarget.Android, NamedBuildTarget.iOS })
98 if (!Equals(target, selected))
99 SetExclusiveOn(target, activeDefine, exclusiveSet);
102 return changedOnSelected;
104 static bool SetExclusiveOn(NamedBuildTarget target,
string enabledDefine, HashSet<string> mutuallyExclusiveDefines)
106 PlayerSettings.GetScriptingDefineSymbols(target, out var defines);
107 var updatedDefines = defines.Where(define => !mutuallyExclusiveDefines.Contains(define)).ToList();
108 updatedDefines.Add(enabledDefine);
110 if (defines.SequenceEqual(updatedDefines))
113 PlayerSettings.SetScriptingDefineSymbols(target, updatedDefines.ToArray());
117 var selected = EditorUserBuildSettings.selectedBuildTargetGroup;
118 var changedOnSelected = SetExclusiveOn(selected, activeDefine, exclusiveSet);
120 foreach (var group
in new[] { BuildTargetGroup.Android, BuildTargetGroup.iOS })
122 if (group != selected && group != BuildTargetGroup.Unknown)
123 SetExclusiveOn(group, activeDefine, exclusiveSet);
126 return changedOnSelected;
128 static bool SetExclusiveOn(BuildTargetGroup group,
string enabledDefine, HashSet<string> mutuallyExclusiveDefines)
130 if (group == BuildTargetGroup.Unknown)
133 var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(group)
134 .Split(
new[] {
';' }, StringSplitOptions.RemoveEmptyEntries)
135 .Select(define => define.Trim())
136 .Where(define => define.Length > 0)
138 var updatedDefines = defines.Where(define => !mutuallyExclusiveDefines.Contains(define)).ToList();
139 updatedDefines.Add(enabledDefine);
141 if (defines.SequenceEqual(updatedDefines))
144 PlayerSettings.SetScriptingDefineSymbolsForGroup(group,
string.Join(
";", updatedDefines));
160 if (
string.IsNullOrWhiteSpace(newDefine))
163#if UNITY_2021_2_OR_NEWER
165 var selected = GetActiveNamedBuildTarget();
167 var changedOnSelected = AddTo(selected, newDefine);
169 foreach (var t
in new[] { NamedBuildTarget.Android, NamedBuildTarget.iOS })
171 if (!Equals(t, selected)) AddTo(t, newDefine);
174 return changedOnSelected;
176 static bool AddTo(NamedBuildTarget t,
string define)
178 PlayerSettings.GetScriptingDefineSymbols(t, out var defs);
179 var list = defs.ToList();
180 if (list.Any(d =>
string.Equals(d, define, StringComparison.Ordinal)))
return false;
183 PlayerSettings.SetScriptingDefineSymbols(t, list.ToArray());
188 var selected = EditorUserBuildSettings.selectedBuildTargetGroup;
189 var changedOnSelected = AddTo(selected, newDefine);
191 foreach (var g
in new[] { BuildTargetGroup.Android, BuildTargetGroup.iOS })
193 if (g != selected && g != BuildTargetGroup.Unknown) AddTo(g, newDefine);
196 return changedOnSelected;
198 static bool AddTo(BuildTargetGroup g,
string define)
200 if (g == BuildTargetGroup.Unknown)
return false;
202 var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(g);
203 var list = defines.Split(
new[] {
';' }, StringSplitOptions.RemoveEmptyEntries)
204 .Select(s => s.Trim()).Where(s => s.Length > 0).ToList();
206 if (list.Any(d =>
string.Equals(d, define, StringComparison.Ordinal)))
return false;
209 PlayerSettings.SetScriptingDefineSymbolsForGroup(g,
string.Join(
";", list));
227 if (
string.IsNullOrWhiteSpace(defineToRemove))
230#if UNITY_2021_2_OR_NEWER
232 var selected = GetActiveNamedBuildTarget();
234 var changedOnSelected = RemoveFrom(selected, defineToRemove);
236 foreach (var t
in new[] { NamedBuildTarget.Android, NamedBuildTarget.iOS })
238 if (!Equals(t, selected)) RemoveFrom(t, defineToRemove);
241 return changedOnSelected;
243 static bool RemoveFrom(NamedBuildTarget t,
string define)
245 PlayerSettings.GetScriptingDefineSymbols(t, out var defs);
246 var list = defs.ToList();
247 var removed = list.RemoveAll(d =>
string.Equals(d, define, StringComparison.Ordinal)) > 0;
248 if (!removed)
return false;
250 PlayerSettings.SetScriptingDefineSymbols(t, list.ToArray());
255 var selected = EditorUserBuildSettings.selectedBuildTargetGroup;
256 var changedOnSelected = RemoveFrom(selected, defineToRemove);
258 foreach (var g
in new[] { BuildTargetGroup.Android, BuildTargetGroup.iOS })
260 if (g != selected && g != BuildTargetGroup.Unknown) RemoveFrom(g, defineToRemove);
263 return changedOnSelected;
265 static bool RemoveFrom(BuildTargetGroup g,
string define)
267 if (g == BuildTargetGroup.Unknown)
return false;
269 var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(g);
270 var list = defines.Split(
new[] {
';' }, StringSplitOptions.RemoveEmptyEntries)
271 .Select(s => s.Trim()).Where(s => s.Length > 0).ToList();
273 var removed = list.RemoveAll(d =>
string.Equals(d, define, StringComparison.Ordinal)) > 0;
274 if (!removed)
return false;
276 PlayerSettings.SetScriptingDefineSymbolsForGroup(g,
string.Join(
";", list));