Space Ad Mobile 9.5.1
Space Ad Mobile makes ads easy to add into your mobile game: one unified workflow for LevelPlay, AdMob, Yandex.Ads across banners, interstitials and rewarded.
Loading...
Searching...
No Matches
DefineSymbolsManager.cs
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using UnityEditor;
5#if UNITY_2021_2_OR_NEWER
6using UnityEditor.Build;
7#endif
8
9namespace SCG.SpaceAdMobile
10{
15 {
16 #region Constants
17
19 public const string GoogleMobileAds = "GOOGLE_MOBILE_ADS";
21 public const string YandexMobileAds = "YANDEX_MOBILE_ADS";
23 public const string LevelPlayMobileAds = "LEVELPLAY_MOBILE_ADS";
24
25 #endregion
26
27 #region Private Helpers
28
29#if UNITY_2021_2_OR_NEWER
31 private static NamedBuildTarget GetActiveNamedBuildTarget() =>
32#if UNITY_6000_0_OR_NEWER
33 NamedBuildTarget.FromBuildTargetGroup(
34 BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget));
35#else
36 NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
37#endif
38#endif
39
40 #endregion
41
42 #region Public API
43
56 public static bool HasDefineSymbol(string define)
57 {
58 if (string.IsNullOrWhiteSpace(define))
59 return false;
60
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));
65#else
66 // Legacy API: *ForGroup
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));
71#endif
72 }
73
80 public static bool SetExclusiveDefineSymbol(string activeDefine, IEnumerable<string> exclusiveDefines)
81 {
82 if (string.IsNullOrWhiteSpace(activeDefine) || exclusiveDefines == null)
83 return false;
84
85 var exclusiveSet = new HashSet<string>(
86 exclusiveDefines.Where(define => !string.IsNullOrWhiteSpace(define)),
87 StringComparer.Ordinal);
88
89 if (!exclusiveSet.Contains(activeDefine))
90 throw new ArgumentException("The active define must be included in the exclusive define set.", nameof(activeDefine));
91
92#if UNITY_2021_2_OR_NEWER
93 var selected = GetActiveNamedBuildTarget();
94 var changedOnSelected = SetExclusiveOn(selected, activeDefine, exclusiveSet);
95
96 foreach (var target in new[] { NamedBuildTarget.Android, NamedBuildTarget.iOS })
97 {
98 if (!Equals(target, selected))
99 SetExclusiveOn(target, activeDefine, exclusiveSet);
100 }
101
102 return changedOnSelected;
103
104 static bool SetExclusiveOn(NamedBuildTarget target, string enabledDefine, HashSet<string> mutuallyExclusiveDefines)
105 {
106 PlayerSettings.GetScriptingDefineSymbols(target, out var defines);
107 var updatedDefines = defines.Where(define => !mutuallyExclusiveDefines.Contains(define)).ToList();
108 updatedDefines.Add(enabledDefine);
109
110 if (defines.SequenceEqual(updatedDefines))
111 return false;
112
113 PlayerSettings.SetScriptingDefineSymbols(target, updatedDefines.ToArray());
114 return true;
115 }
116#else
117 var selected = EditorUserBuildSettings.selectedBuildTargetGroup;
118 var changedOnSelected = SetExclusiveOn(selected, activeDefine, exclusiveSet);
119
120 foreach (var group in new[] { BuildTargetGroup.Android, BuildTargetGroup.iOS })
121 {
122 if (group != selected && group != BuildTargetGroup.Unknown)
123 SetExclusiveOn(group, activeDefine, exclusiveSet);
124 }
125
126 return changedOnSelected;
127
128 static bool SetExclusiveOn(BuildTargetGroup group, string enabledDefine, HashSet<string> mutuallyExclusiveDefines)
129 {
130 if (group == BuildTargetGroup.Unknown)
131 return false;
132
133 var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(group)
134 .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
135 .Select(define => define.Trim())
136 .Where(define => define.Length > 0)
137 .ToArray();
138 var updatedDefines = defines.Where(define => !mutuallyExclusiveDefines.Contains(define)).ToList();
139 updatedDefines.Add(enabledDefine);
140
141 if (defines.SequenceEqual(updatedDefines))
142 return false;
143
144 PlayerSettings.SetScriptingDefineSymbolsForGroup(group, string.Join(";", updatedDefines));
145 return true;
146 }
147#endif
148 }
149
158 public static bool AddDefineSymbol(string newDefine)
159 {
160 if (string.IsNullOrWhiteSpace(newDefine))
161 return false;
162
163#if UNITY_2021_2_OR_NEWER
164 // Modern API
165 var selected = GetActiveNamedBuildTarget();
166
167 var changedOnSelected = AddTo(selected, newDefine);
168
169 foreach (var t in new[] { NamedBuildTarget.Android, NamedBuildTarget.iOS })
170 {
171 if (!Equals(t, selected)) AddTo(t, newDefine);
172 }
173
174 return changedOnSelected;
175
176 static bool AddTo(NamedBuildTarget t, string define)
177 {
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;
181
182 list.Add(define);
183 PlayerSettings.SetScriptingDefineSymbols(t, list.ToArray());
184 return true;
185 }
186#else
187 // Legacy API
188 var selected = EditorUserBuildSettings.selectedBuildTargetGroup;
189 var changedOnSelected = AddTo(selected, newDefine);
190
191 foreach (var g in new[] { BuildTargetGroup.Android, BuildTargetGroup.iOS })
192 {
193 if (g != selected && g != BuildTargetGroup.Unknown) AddTo(g, newDefine);
194 }
195
196 return changedOnSelected;
197
198 static bool AddTo(BuildTargetGroup g, string define)
199 {
200 if (g == BuildTargetGroup.Unknown) return false;
201
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();
205
206 if (list.Any(d => string.Equals(d, define, StringComparison.Ordinal))) return false;
207
208 list.Add(define);
209 PlayerSettings.SetScriptingDefineSymbolsForGroup(g, string.Join(";", list));
210 return true;
211 }
212#endif
213 }
214
225 public static bool RemoveDefineSymbol(string defineToRemove)
226 {
227 if (string.IsNullOrWhiteSpace(defineToRemove))
228 return false;
229
230#if UNITY_2021_2_OR_NEWER
231 // Modern API
232 var selected = GetActiveNamedBuildTarget();
233
234 var changedOnSelected = RemoveFrom(selected, defineToRemove);
235
236 foreach (var t in new[] { NamedBuildTarget.Android, NamedBuildTarget.iOS })
237 {
238 if (!Equals(t, selected)) RemoveFrom(t, defineToRemove);
239 }
240
241 return changedOnSelected;
242
243 static bool RemoveFrom(NamedBuildTarget t, string define)
244 {
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;
249
250 PlayerSettings.SetScriptingDefineSymbols(t, list.ToArray());
251 return true;
252 }
253#else
254 // Legacy API
255 var selected = EditorUserBuildSettings.selectedBuildTargetGroup;
256 var changedOnSelected = RemoveFrom(selected, defineToRemove);
257
258 foreach (var g in new[] { BuildTargetGroup.Android, BuildTargetGroup.iOS })
259 {
260 if (g != selected && g != BuildTargetGroup.Unknown) RemoveFrom(g, defineToRemove);
261 }
262
263 return changedOnSelected;
264
265 static bool RemoveFrom(BuildTargetGroup g, string define)
266 {
267 if (g == BuildTargetGroup.Unknown) return false;
268
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();
272
273 var removed = list.RemoveAll(d => string.Equals(d, define, StringComparison.Ordinal)) > 0;
274 if (!removed) return false;
275
276 PlayerSettings.SetScriptingDefineSymbolsForGroup(g, string.Join(";", list));
277 return true;
278 }
279#endif
280 }
281
282 #endregion
283 }
284}
static bool SetExclusiveDefineSymbol(string activeDefine, IEnumerable< string > exclusiveDefines)
Enables one symbol and disables the other mutually exclusive symbols in a single update.
const string YandexMobileAds
Specifies the yandex mobile ads.
static bool HasDefineSymbol(string define)
Checks whether a scripting define symbol is present for the currently selected build target.
const string GoogleMobileAds
Specifies the google mobile ads.
static bool AddDefineSymbol(string newDefine)
Add a scripting define symbol for the currently selected build target. Uses the modern NamedBuildTarg...
const string LevelPlayMobileAds
Specifies the level play mobile ads.
static bool RemoveDefineSymbol(string defineToRemove)
Removes a scripting define symbol from the currently selected build target. Uses the modern NamedBuil...
Provides define symbols manager functionality.