com.amanotes.gdk 0.2.67 → 0.2.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/Editor/AmaGDKEditor.cs +76 -22
  3. package/Editor/AmaGDKExtra.cs +14 -13
  4. package/Editor/Extra/GDKAutoUpdateAdapter.cs +14 -1
  5. package/Editor/Extra/GDKSymbolDefine.cs +372 -0
  6. package/Editor/{AmaGDKManager.cs.meta → Extra/GDKSymbolDefine.cs.meta} +1 -1
  7. package/Editor/Utils/AmaGDKEditor.ExtractVersion.cs +35 -3
  8. package/Extra/AmaGDKInstaller.unitypackage +0 -0
  9. package/Extra/CheckDiskSpace.unitypackage +0 -0
  10. package/Extra/Consent.unitypackage +0 -0
  11. package/Extra/{GoogleCMP.unitypackage.meta → Consent.unitypackage.meta} +1 -1
  12. package/Extra/ForceUpdate.unitypackage +0 -0
  13. package/Extra/LegacyGDKUpdateHelper.unitypackage +0 -0
  14. package/Extra/PostProcessor.unitypackage +0 -0
  15. package/Packages/AmaGDKConfig.unitypackage +0 -0
  16. package/Packages/AmaGDKExample.unitypackage +0 -0
  17. package/Packages/AmaGDKTest.unitypackage +0 -0
  18. package/Packages/AppsFlyerAdapter.PurchaseConnector.unitypackage +0 -0
  19. package/Packages/AppsFlyerAdapter.unitypackage +0 -0
  20. package/Packages/FirebaseAnalyticsAdapter.unitypackage +0 -0
  21. package/Packages/FirebaseRemoteConfigAdapter.unitypackage +0 -0
  22. package/Packages/IronSourceAdapter.unitypackage +0 -0
  23. package/Packages/MaxAdNetworkAdapter.unitypackage +0 -0
  24. package/{Editor/Resources.meta → Packages/MaxAdNetworkAdapter.unitypackage.meta} +1 -2
  25. package/Packages/RevenueCatAdapter.unitypackage +0 -0
  26. package/Packages/SqliteAnalyticsAdapter.unitypackage +0 -0
  27. package/Runtime/Ad/AdExtension.cs +2 -0
  28. package/Runtime/Ad/AdLogic.cs +79 -69
  29. package/Runtime/Ad/AdShowContext.cs +1 -0
  30. package/Runtime/Ad/AmaGDK.Ads.cs +17 -3
  31. package/Runtime/AmaGDK.Adapters.cs +12 -5
  32. package/Runtime/AmaGDK.Consent.cs +259 -0
  33. package/Runtime/AmaGDK.Consent.cs.meta +11 -0
  34. package/Runtime/AmaGDK.cs +25 -14
  35. package/Runtime/AudioToolkit/AmaGDK.Audio.Latency.cs +1 -3
  36. package/Runtime/AudioToolkit/AmaGDK.Audio.cs +56 -24
  37. package/Runtime/AudioToolkit/Plugins/Android/GDKAudioDeviceDetector.java +1 -1
  38. package/Runtime/Fps/AmaFPS.cs +0 -1
  39. package/Runtime/Fps/AmaFPSVisualizer.cs +7 -7
  40. package/Runtime/Internal/AmaGDK.Internal.AmaGUI.cs +1 -1
  41. package/Runtime/Internal/GDKGeoLocationcs.cs +3 -1
  42. package/Runtime/Internal/GDKServerTime.cs +13 -10
  43. package/package.json +1 -1
  44. package/Editor/AmaGDKManager.cs +0 -235
  45. package/Editor/Resources/amasdk-modules.json +0 -31
  46. package/Editor/Resources/amasdk-modules.json.meta +0 -7
  47. package/Extra/GoogleCMP.unitypackage +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.2.69 - 2024-07-26]
4
+ - [Fix] disable Max adapter
5
+ - [Dev] Update OnAdResult callback
6
+ - [Fix] Waiting for ad callback
7
+ - [Feature] AdEventTracking for Max ad network
8
+ - [Fix] Wait until the application regains focus after showing ads
9
+ - [Fix] Add OnAdReward callback for Max adapter
10
+ - [Fix] Wrong coverage report for unity 2021
11
+ - [Dev] Multiple AdAdapters is not supported
12
+ - [Fix] Do not register disabled adapter
13
+ - [Fix] add logic ad isSuccess
14
+ - [Fix] Force-close ad when OnAdClose callback is missing
15
+ - [Feature] Consent module: ATT + CMP
16
+ - [Fix] Warning in RevenueCat Adapter
17
+ - [Dev] Clean up timeout override for adapters
18
+ - [Fix] Do not init disabled Adapters
19
+ - [Dev] Remove AmaGDKManager
20
+ - [Fix] Max Mediation not show up in AmaGDK Inspector
21
+ - [Fix] iOS build process hang
22
+ - [Feature] Add Max Ad Network Adapter
23
+ - [Dev] Add option force clean up
24
+ - [Fix] Warning FPS Module
25
+ - [Dev] Config timeout for each adapter
26
+ - [Fix] GDKSymbolDefine Log methods should not require context object
27
+ - [Fix] Do not automatically reimport adapters in dev mode (for LegacyGDKUpdateHelper)
28
+ - [Dev] Add GDK Symbol Define
29
+ - Also: Option to generate a custom logger
30
+ - [Dev] Improve GDK inspector UI with tooltip & logo
31
+ - [Fix] Warnings for AutoUpdate module in dev mode
32
+ - [Fix] Do not automatically reimport adapters in dev mode
33
+ - [Dev] Display module flags in AmaGDK inspector
34
+ - [Dev] Enable AudioModule by default
35
+ - [Dev] Standardize variable names
36
+
37
+ ## [0.2.68 - 2024-07-08]
38
+ - [Dev] Add IronSource setting to pause game during ad
39
+ - [Fix] Support Android API Version 24 and below
40
+ - [Dev] Add Audio Module flag
41
+
3
42
  ## [0.2.67 - 2024-07-04]
4
43
  - [Fix] Do retry immediately when OnAdLoadFailed trigger regardless of reason
5
44
  - Also: Update default ad request timeout to 30 secs
@@ -51,6 +51,7 @@ namespace Amanotes.Editor
51
51
  FIREBASE_REMOTE_CONFIG,
52
52
  APPSFLYER,
53
53
  IRONSOURCE,
54
+ MAX,
54
55
  REVENUECAT
55
56
  };
56
57
 
@@ -235,26 +236,67 @@ namespace Amanotes.Editor
235
236
  // Debug.Log($"Content of version_info.tsv copied to clipboard!\n\n{tsv}\n\n");
236
237
  // }
237
238
 
239
+ void ShowAmaGDKContext()
240
+ {
241
+ var menu = new GenericMenu();
242
+ menu.AddDisabledItem(new GUIContent("AmaGDK"));
243
+ menu.AddSeparator("");
244
+ menu.AddItem(new GUIContent("Auto Init"), sdk.autoInit, () =>
245
+ {
246
+ sdk.autoInit = !sdk.autoInit;
247
+ EditorUtility.SetDirty(sdk);
248
+ });
249
+ menu.AddItem(new GUIContent("Clear Cache"), false, () =>
250
+ {
251
+ GDKFileUtils.ClearCacheData();
252
+ });
253
+ menu.AddSeparator("");
254
+ menu.AddItem(new GUIContent("Change Log"), false, () =>
255
+ {
256
+ Application.OpenURL("https://amagdk.notion.site/Change-Log-6dfd4b67d64f496bbd9eb04ccb4ef95a");
257
+ });
258
+ menu.AddItem(new GUIContent("Documentation"), false, () =>
259
+ {
260
+ Application.OpenURL("https://amagdk.notion.site/Ama-GDK-a73596617ab247b6a43c8f12a1581415?pvs=4");
261
+ });
262
+ menu.ShowAsContext();
263
+ UnityEvent.current.Use();
264
+ }
265
+
266
+ private static GUIContent hamburgerIcon;
267
+ private static readonly Lazy<Texture2D> logo = new Lazy<Texture2D>(() =>
268
+ {
269
+ const string logoBase64 =
270
+ "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAAHdbkFIAAAAAXNSR0IArs4c6QAAALhlWElmTU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEyAAIAAAAUAAAAWodpAAQAAAABAAAAbgAAAAAAAABIAAAAAQAAAEgAAAABMjAyNDowNzoxMCAxMjoyOTowMQAABJAEAAIAAAAUAAAApKABAAMAAAABAAEAAKACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAAAyMDI0OjA3OjEwIDEyOjA3OjQ4APsHu7YAAAAJcEhZcwAACxMAAAsTAQCanBgAAAlZaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDI0LTA3LTEwVDEyOjI5OjAxKzA3OjAwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMjQtMDctMTBUMTI6MDc6NDgrMDc6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDI0LTA3LTEwVDEyOjI5OjAxKzA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAyNC0wNy0xMFQxMjoxOTowOCswNzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpiM2Y2ZDQ5My1iYTI4LTQwZGQtODUxMC0yNzJlYzYyMjM3Nzg8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgMjIuNCAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAyNC0wNy0xMFQxMjoyOTowMSswNzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo0ZjFkOWU5NS1hZjdjLTQzZDQtYTczYS1kODZhMTI4MDI3YjE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6YjNmNmQ0OTMtYmEyOC00MGRkLTg1MTAtMjcyZWM2MjIzNzc4PC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6YjNmNmQ0OTMtYmEyOC00MGRkLTg1MTAtMjcyZWM2MjIzNzc4PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjRmMWQ5ZTk1LWFmN2MtNDNkNC1hNzNhLWQ4NmExMjgwMjdiMTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzI8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyPC90aWZmOllSZXNvbHV0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KFOd9IgAAF2JJREFUeAHtOwl0lcXVd+Zb3paXlxASAQElgEDC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";
271
+ var tex = new Texture2D(2, 2, TextureFormat.RGBA32, false, true);
272
+ tex.LoadImage(Convert.FromBase64String(logoBase64), true);
273
+ return tex;
274
+ });
275
+
276
+ [NonSerialized] private static GUIContent bannerTitle;
277
+
238
278
  void DrawGUI_AmaGDKBanner()
239
279
  {
240
- AmaGUI.SectionLabel($"<b>AmaGDK</b> <size=12><color=gray>v{AmaGDK.VERSION}</color></size>");
280
+ bannerTitle ??= new GUIContent()
281
+ {
282
+ image = logo.Value,
283
+ text = $"<b>AmaGDK</b> <size=12><color=gray>v{AmaGDK.VERSION}</color></size>"
284
+ };
285
+ AmaGUI.SectionLabel(bannerTitle);
241
286
  var rect = GUILayoutUtility.GetLastRect();
242
- if (UnityEvent.current.isMouse && UnityEvent.current.button == 1 && rect.Contains(UnityEvent.current.mousePosition))
287
+ var btnRect = rect;
288
+
289
+ // btnRect.x = 4f;
290
+ // btnRect.width = 24f; //btnRect.xMax -
291
+ // btnRect.yMin = btnRect.yMax - 32f;
292
+
293
+ btnRect.xMin = btnRect.xMax - 24f;
294
+ btnRect.yMin = btnRect.yMax - 32f;
295
+
296
+ if (hamburgerIcon == null) hamburgerIcon = EditorGUIUtility.IconContent("d__Menu@2X");
297
+ if (GUI.Button(btnRect, hamburgerIcon.image, EditorStyles.label))
243
298
  {
244
- var menu = new GenericMenu();
245
- menu.AddDisabledItem(new GUIContent("AmaGDK"));
246
- menu.AddSeparator("");
247
- menu.AddItem(new GUIContent("Auto Init"), sdk.autoInit, () =>
248
- {
249
- sdk.autoInit = !sdk.autoInit;
250
- EditorUtility.SetDirty(sdk);
251
- });
252
- menu.AddItem(new GUIContent("Clear Cache"), false, () =>
253
- {
254
- GDKFileUtils.ClearCacheData();
255
- });
256
- menu.ShowAsContext();
257
- UnityEvent.current.Use();
299
+ ShowAmaGDKContext();
258
300
  }
259
301
  }
260
302
 
@@ -306,8 +348,10 @@ namespace Amanotes.Editor
306
348
 
307
349
  configSO = new SerializedObject(configAsset);
308
350
  configSO.Update();
309
- DrawProperty(configSO, "common");
310
- EditorGUILayout.ObjectField("Config", configAsset, typeof(ScriptableObject), false);
351
+ DrawProperty(configSO, "common", true);
352
+ DrawProperty(configSO, "enableAudioModule", false);
353
+ DrawProperty(configSO, "enableServerTime", false);
354
+ DrawProperty(configSO, "enableGeoLocation", false);
311
355
  GUILayout.Space(8f);
312
356
  for (var i = 0; i < allAdapters.Count; i++)
313
357
  {
@@ -318,6 +362,7 @@ namespace Amanotes.Editor
318
362
 
319
363
  AmaGUI.Foldout("Adapters", ref showAdapterInstaller, DrawGUI_AdapterList);
320
364
  AmaGUI.Foldout("Extras", ref showExtra, DrawGUI_ExtraList);
365
+ EditorGUILayout.ObjectField("Config", configAsset, typeof(ScriptableObject), false);
321
366
  Profiler.EndSample();
322
367
  }
323
368
 
@@ -401,7 +446,7 @@ namespace Amanotes.Editor
401
446
 
402
447
  }, () =>
403
448
  {
404
- if (icon != null)
449
+ if (icon != null && adapter != null && adapter.enabled)
405
450
  {
406
451
  Rect rect = GUILayoutUtility.GetRect(6f, 6f, 16f, 16f);
407
452
  rect.xMin -= 10f;
@@ -487,7 +532,7 @@ namespace Amanotes.Editor
487
532
  EditorGUI.BeginDisabledGroup(!adapter.enabled);
488
533
  EditorGUIUtility.labelWidth += 70;
489
534
  {
490
- DrawProperty(configSO, adapterId);
535
+ DrawProperty(configSO, adapterId, true);
491
536
  GUILayout.Space(8f);
492
537
 
493
538
  if (adapterId == IRONSOURCE)
@@ -515,11 +560,20 @@ namespace Amanotes.Editor
515
560
  EditorGUI.EndDisabledGroup();
516
561
  }
517
562
 
518
- private static void DrawProperty(SerializedObject so, string propertyField)
563
+ private static void DrawProperty(SerializedObject so, string propertyField, bool childrenOnly)
519
564
  {
520
565
  SerializedProperty property = so.FindProperty(propertyField);
521
- if (property == null) return;
566
+ if (property == null)
567
+ {
568
+ EditorGUILayout.HelpBox($"Property not found <{propertyField}>!", MessageType.Warning);
569
+ return;
570
+ }
522
571
 
572
+ if (!childrenOnly)
573
+ {
574
+ EditorGUILayout.PropertyField(property);
575
+ }
576
+
523
577
  string basePath = property.propertyPath;
524
578
  var first = true;
525
579
  while (property.NextVisible(first))
@@ -7,20 +7,21 @@ namespace Amanotes.Editor
7
7
  {
8
8
  public static Dictionary<string, object> GetThirdPartyVersions()
9
9
  {
10
- Dictionary<string, object> dicThirdParty = new Dictionary<string, object>();
11
- List<GDKModule> listModule = VersionHelper.LoadLocalModuleInfo();
12
- foreach (var module in listModule)
10
+ var dicThirdParty = new Dictionary<string, object>
13
11
  {
14
- VersionHelper.UpdateListVersions(module);
15
- dicThirdParty.Add(module.id, ExtractVersion.ThirdParty(module.id));
16
- }
17
-
18
- dicThirdParty["Firebase"] = AmaGDKExtra.FirebaseVersion();
19
- dicThirdParty["AmaGDK"] = AmaGDK.VERSION;
20
- dicThirdParty["AdQuality"] = ExtractVersion.IronSourceAdQuality();
21
- dicThirdParty["AdRevenue"] = ExtractVersion.AppsFlyerAdRevenue();
22
- dicThirdParty["ACM"] = ExtractVersion.Acm();
23
- dicThirdParty["FacebookSDK"] = ExtractVersion.Facebook();
12
+ ["FirebaseAnalytics"] = ExtractVersion.FirebaseAnalytics(),
13
+ ["FirebaseRemoteConfig"] = ExtractVersion.FirebaseRemoteConfig(),
14
+ ["AppsFlyer"] = ExtractVersion.AppsFlyer(),
15
+ ["IronSource"] = ExtractVersion.IronSource(),
16
+ ["Max"] = ExtractVersion.Max(),
17
+ ["RevenueCat"] = ExtractVersion.RevenueCat(),
18
+ ["Firebase"] = AmaGDKExtra.FirebaseVersion(),
19
+ ["AmaGDK"] = AmaGDK.VERSION,
20
+ ["AdQuality"] = ExtractVersion.IronSourceAdQuality(),
21
+ ["AdRevenue"] = ExtractVersion.AppsFlyerAdRevenue(),
22
+ ["ACM"] = ExtractVersion.Acm(),
23
+ ["FacebookSDK"] = ExtractVersion.Facebook()
24
+ };
24
25
 
25
26
  return dicThirdParty;
26
27
  }
@@ -23,11 +23,23 @@ namespace Amanotes.Editor
23
23
  // Extra packages
24
24
  { "DiskSpacePopup", $"{Res.EXTRA_PATH}CheckDiskSpace.unitypackage" },
25
25
  { "ForceUpdatePopup", $"{Res.EXTRA_PATH}ForceUpdate.unitypackage" },
26
- { "GoogleCMPSupport", $"{Res.EXTRA_PATH}GoogleCMP.unitypackage" },
26
+ { "Consent.ATTSupport", $"{Res.EXTRA_PATH}Consent.unitypackage" },
27
+ { "Consent.GoogleCMPSupport", $"{Res.EXTRA_PATH}Consent.unitypackage" },
27
28
  { "AndroidPostProcessor", $"{Res.EXTRA_PATH}PostProcessor.unitypackage" }
28
29
  };
29
30
 
30
31
  private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
32
+ {
33
+ #if AMAGDK_DEV
34
+ return;
35
+ #endif
36
+
37
+ #pragma warning disable CS0162
38
+ CheckImportedAssets(importedAssets);
39
+ #pragma warning restore CS0162
40
+ }
41
+
42
+ private static void CheckImportedAssets(string[] importedAssets)
31
43
  {
32
44
  if (importedAssets.Length == 0) return;
33
45
  // Debug.LogWarning($"importedAssets: {string.Join("\n", importedAssets)}");
@@ -53,6 +65,7 @@ namespace Amanotes.Editor
53
65
  continue;
54
66
  }
55
67
 
68
+ if (packages.Contains(kvp.Value)) continue;
56
69
  packages.Add(kvp.Value);
57
70
  }
58
71
 
@@ -0,0 +1,372 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.IO;
4
+ using System.Linq;
5
+ using UnityEngine;
6
+ using UnityEditor;
7
+ using UnityEngine.Serialization;
8
+ using UnityObject = UnityEngine.Object;
9
+
10
+ namespace Amanotes.Core
11
+ {
12
+ [CreateAssetMenu(fileName = "GDKSymbolDefine", menuName = "Ama GDK/GDK Symbol Define", order = 100)]
13
+ internal partial class GDKSymbolDefine : ScriptableObject
14
+ {
15
+ private static readonly string cscRspFilePath = "Assets/csc.rsp";
16
+ public List<SymbolInfo> symbols = new List<SymbolInfo>();
17
+ public LoggerConfig loggerConfig = new LoggerConfig();
18
+
19
+
20
+ [ContextMenu("Read")]
21
+ public void Read()
22
+ {
23
+ if (!File.Exists(cscRspFilePath)) return;
24
+
25
+ var enabledSymbols = new HashSet<string>(ReadCSC());
26
+ AddSymbol(enabledSymbols, true);
27
+ SetEnableSymbols(enabledSymbols, true);
28
+ }
29
+
30
+ private void Write()
31
+ {
32
+ var list = symbols
33
+ .Union(this.loggerConfig.tags)
34
+ .Where(item=>item.enabled)
35
+ .Select(item => item.name)
36
+ .Distinct()
37
+ .ToArray();
38
+
39
+ string content = list.Length > 0 ? $"-define:{string.Join(";", list)}" : string.Empty;
40
+ File.WriteAllText(cscRspFilePath, content);
41
+ AssetDatabase.Refresh();
42
+ }
43
+
44
+ [ContextMenu("Apply")]
45
+ public void Apply()
46
+ {
47
+ Write();
48
+ loggerConfig.GenerateLogger();
49
+
50
+ #if UNITY_EDITOR
51
+ EditorUtility.SetDirty((this));
52
+ AssetDatabase.Refresh();
53
+ #endif
54
+ }
55
+
56
+ private void SetEnableSymbols(HashSet<string> enabledSymbols, bool enabled)
57
+ {
58
+ for (var i = 0; i < symbols.Count; i++)
59
+ {
60
+ symbols[i].enabled = enabledSymbols.Contains(symbols[i].name);
61
+ }
62
+
63
+ for (var i = 0; i < loggerConfig.tags.Count; i++)
64
+ {
65
+ loggerConfig.tags[i].enabled = enabledSymbols.Contains(loggerConfig.tags[i].name);
66
+ }
67
+ }
68
+
69
+ private void AddSymbol(IEnumerable<string> newSymbols, bool enabled)
70
+ {
71
+ var dict = symbols
72
+ .Union(loggerConfig.tags)
73
+ .Distinct()
74
+ .ToDictionary(item => item.name);
75
+
76
+ foreach (string symbol in newSymbols)
77
+ {
78
+ if (dict.TryGetValue(symbol, out var info)) continue;
79
+ info = new SymbolInfo() { name = symbol, enabled = enabled };
80
+ symbols.Add(info);
81
+ }
82
+
83
+ #if UNITY_EDITOR
84
+ EditorUtility.SetDirty(this);
85
+ #endif
86
+ }
87
+
88
+ private List<string> ReadCSC()
89
+ {
90
+ var result = new List<string>();
91
+ if (!File.Exists(cscRspFilePath)) return result;
92
+ string[] rspLines = File.ReadAllLines(cscRspFilePath);
93
+
94
+ foreach (string line in rspLines)
95
+ {
96
+ string line2 = line.Trim();
97
+ if (!line2.StartsWith("-define:")) continue;
98
+
99
+ // Extract existing symbols from -define:
100
+ result.AddRange(line2.Substring(8).Split(';'));
101
+ }
102
+
103
+ return result;
104
+ }
105
+ }
106
+
107
+ internal partial class GDKSymbolDefine
108
+ {
109
+ [Serializable] internal class SymbolInfo
110
+ {
111
+ [FormerlySerializedAs("symbol")] public string name;
112
+ public bool enabled;
113
+ }
114
+
115
+ [Serializable] internal class LoggerConfig
116
+ {
117
+ public bool enabled;
118
+ public bool forceCleanUp;
119
+ public UnityObject codeGenerateFolder;
120
+ public string codeGeneratePath
121
+ {
122
+ get
123
+ {
124
+ string path = AssetDatabase.GetAssetPath(codeGenerateFolder);
125
+ if (AssetDatabase.IsValidFolder(path)) return path;
126
+
127
+ var defaultPath = "Assets/AmaGDK/LogV2";
128
+ var asset = AssetDatabase.LoadAssetAtPath<UnityObject>(defaultPath);
129
+ if (asset != null) codeGenerateFolder = asset;
130
+ return defaultPath;
131
+ }
132
+ }
133
+ public string className = "LogV2";
134
+
135
+ [HideInInspector][SerializeField] private string classTemplate = $@"using Debug = UnityEngine.Debug;
136
+ using UnityObject = UnityEngine.Object;
137
+
138
+ public partial class $$CLASS_NAME$$
139
+ {{
140
+ private static void Log(string tag, string message, UnityObject context)
141
+ {{
142
+ Debug.Log($""[{{tag}}] {{message}}"", context);
143
+ }}
144
+
145
+ private static void LogWarning(string tag, string message, UnityObject context)
146
+ {{
147
+ Debug.LogWarning($""[{{tag}}] {{message}}"", context);
148
+ }}
149
+
150
+ private static void LogError(string tag, string message, UnityObject context)
151
+ {{
152
+ Debug.LogError($""[{{tag}}] {{message}}"", context);
153
+ }}
154
+ }}";
155
+
156
+ public List<SymbolInfo> tags = new List<SymbolInfo>();
157
+
158
+ public void GenerateLogger()
159
+ {
160
+ if (!enabled) return;
161
+
162
+ bool hasFolder = Directory.Exists(codeGeneratePath);
163
+ if (hasFolder)
164
+ {
165
+ if (forceCleanUp)
166
+ {
167
+ Directory.Delete(codeGeneratePath, true);
168
+ hasFolder = false;
169
+ }
170
+ }
171
+
172
+ if (!hasFolder) Directory.CreateDirectory(codeGeneratePath);
173
+
174
+ // Generate main logger class
175
+ string filePath = Path.Combine(codeGeneratePath, $"{className}.cs");
176
+ string classContent;
177
+
178
+ if (!File.Exists(filePath))
179
+ {
180
+ classContent = classTemplate.Replace("$$CLASS_NAME$$", className);
181
+ File.WriteAllText(filePath, classContent);
182
+ AssetDatabase.ImportAsset(filePath);
183
+ }
184
+
185
+ // Generate derived logger classes
186
+ for (var i = 0; i < tags.Count; i++)
187
+ {
188
+ string tag = tags[i].name;
189
+ classContent = GenerateTagClassContent(tag);
190
+ filePath = Path.Combine(codeGeneratePath, $"{className}.{tag}.cs");
191
+ File.WriteAllText(filePath, classContent);
192
+ AssetDatabase.ImportAsset(filePath);
193
+ }
194
+ }
195
+
196
+ private string GenerateTagClassContent(string tag)
197
+ {
198
+ return $@"using System.Diagnostics;
199
+ using UnityObject = UnityEngine.Object;
200
+
201
+ public partial class {className}
202
+ {{
203
+ public static class {tag}
204
+ {{
205
+ [Conditional(nameof({tag}))]
206
+ public static void Log(string message, UnityObject context = null) => {className}.Log(nameof({tag}), message, context);
207
+
208
+ [Conditional(nameof({tag}))]
209
+ public static void LogWarning(string message, UnityObject context = null) => {className}.LogWarning(nameof({tag}),message, context);
210
+
211
+ [Conditional(nameof({tag}))]
212
+ public static void LogError(string message, UnityObject context = null) => {className}.LogError(nameof({tag}), message, context);
213
+ }}
214
+ }}";
215
+ }
216
+ }
217
+ }
218
+
219
+
220
+ // INSPECTOR
221
+
222
+ [CustomPropertyDrawer(typeof(GDKSymbolDefine.SymbolInfo))]
223
+ internal class SymbolInfoDrawer : PropertyDrawer
224
+ {
225
+ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
226
+ {
227
+ // Begin property drawing
228
+ EditorGUI.BeginProperty(position, label, property);
229
+
230
+ // Calculate rects
231
+ var toggleRect = new Rect(position.x, position.y, 20, position.height);
232
+ var labelRect = new Rect(position.x + 25, position.y, position.width - 25, position.height);
233
+
234
+ // Draw fields
235
+ SerializedProperty symbolProperty = property.FindPropertyRelative("name");
236
+ SerializedProperty enabledProperty = property.FindPropertyRelative("enabled");
237
+
238
+ // Draw the enabled toggle
239
+ enabledProperty.boolValue = EditorGUI.Toggle(toggleRect, enabledProperty.boolValue);
240
+
241
+ // Draw the symbol name field
242
+ symbolProperty.stringValue = EditorGUI.TextField(labelRect, symbolProperty.stringValue, EditorStyles.label);
243
+
244
+ // End property drawing
245
+ EditorGUI.EndProperty();
246
+ }
247
+ }
248
+
249
+ [CustomEditor(typeof(GDKSymbolDefine))]
250
+ public class GDKSymbolDefineEditor : UnityEditor.Editor
251
+ {
252
+ private SerializedProperty symbolsProp;
253
+ private SerializedProperty loggerConfigProp;
254
+ private int selectedTab = 0;
255
+ private GDKSymbolDefine define;
256
+
257
+
258
+ private readonly GUIContent[] tabTitles = new GUIContent[]
259
+ {
260
+ new GUIContent("Symbols"),
261
+ new GUIContent("Logger Config")
262
+ };
263
+
264
+ private void OnEnable()
265
+ {
266
+ define = (GDKSymbolDefine)target;
267
+ symbolsProp = serializedObject.FindProperty("symbols");
268
+ loggerConfigProp = serializedObject.FindProperty("loggerConfig");
269
+ }
270
+
271
+ public override void OnInspectorGUI()
272
+ {
273
+ if (Application.isPlaying || EditorApplication.isPlayingOrWillChangePlaymode)
274
+ {
275
+ EditorGUILayout.HelpBox("Disabled in play mode!", MessageType.Info);
276
+ Repaint();
277
+ return;
278
+ }
279
+
280
+ if (EditorApplication.isUpdating)
281
+ {
282
+ EditorGUILayout.HelpBox("Please wait for Unity Editor to finish importing!", MessageType.Info);
283
+ Repaint();
284
+ return;
285
+ }
286
+
287
+ if (EditorApplication.isCompiling)
288
+ {
289
+ EditorGUILayout.HelpBox("Please wait for Unity Editor to finish compiling!", MessageType.Info);
290
+ Repaint();
291
+ return;
292
+ }
293
+
294
+ if (define == null) return;
295
+
296
+ serializedObject.Update();
297
+ selectedTab = GUILayout.Toolbar(selectedTab, tabTitles, GUILayout.Height(32f));
298
+
299
+ switch (selectedTab)
300
+ {
301
+ case 0:
302
+ DrawSymbolsTab();
303
+ break;
304
+ case 1:
305
+ DrawLoggerConfigTab();
306
+ break;
307
+ default:
308
+ DrawSymbolsTab();
309
+ break;
310
+ }
311
+
312
+ GUILayout.Space(24f);
313
+ if (GUILayout.Button("Apply", GUILayout.Height(30f)))
314
+ {
315
+ define.Apply();
316
+ Repaint();
317
+ }
318
+
319
+ serializedObject.ApplyModifiedProperties();
320
+ }
321
+
322
+ private void DrawSymbolsTab()
323
+ {
324
+ EditorGUILayout.PropertyField(symbolsProp, new GUIContent("DEFINE SYMBOLS"), true);
325
+ if (define.loggerConfig.enabled)
326
+ {
327
+ EditorGUILayout.PropertyField(loggerConfigProp.FindPropertyRelative("tags"), new GUIContent("LOGGER TAGS"), true);
328
+ }
329
+ }
330
+
331
+ private static bool showTemplate = false;
332
+ private void DrawLoggerConfigTab()
333
+ {
334
+ // EditorGUILayout.PropertyField(loggerConfigProp, GUIContent.none, true);
335
+ DrawProperty(serializedObject, "loggerConfig", true);
336
+ showTemplate = GUILayout.Toggle(showTemplate, "Logger class template", EditorStyles.foldout);
337
+ if (showTemplate)
338
+ {
339
+ var prop = serializedObject
340
+ .FindProperty("loggerConfig")
341
+ .FindPropertyRelative("classTemplate");
342
+ EditorGUILayout.PropertyField(prop, GUIContent.none, false, GUILayout.Height(16 * 20));
343
+ }
344
+ }
345
+
346
+ private static void DrawProperty(SerializedObject so, string propertyField, bool childrenOnly)
347
+ {
348
+ SerializedProperty property = so.FindProperty(propertyField);
349
+ if (property == null)
350
+ {
351
+ EditorGUILayout.HelpBox($"Property not found <{propertyField}>!", MessageType.Warning);
352
+ return;
353
+ }
354
+
355
+ if (!childrenOnly)
356
+ {
357
+ EditorGUILayout.PropertyField(property);
358
+ }
359
+
360
+ string basePath = property.propertyPath;
361
+ var first = true;
362
+ while (property.NextVisible(first))
363
+ {
364
+ first = false;
365
+ if (!property.propertyPath.Contains(basePath)) break;
366
+ EditorGUILayout.PropertyField(property);
367
+ }
368
+
369
+ so.ApplyModifiedProperties();
370
+ }
371
+ }
372
+ }
@@ -1,5 +1,5 @@
1
1
  fileFormatVersion: 2
2
- guid: 44c77ba58d5d742d68829b3d5b04a3bf
2
+ guid: ac69671f3a58f434a83023380f963e8b
3
3
  MonoImporter:
4
4
  externalObjects: {}
5
5
  serializedVersion: 2