Analytics.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. namespace UnityEngine.Monetization
  5. {
  6. /// <summary>
  7. /// Decorates Unity Analytics "Standard Events" with extras for correlating events to our game and advertising IDs.
  8. /// </summary>
  9. static class Analytics
  10. {
  11. // See also https://gitlab.internal.unity3d.com/upm-packages/analytics/com.unity.analytics
  12. static string s_StandardEventsClassName = "UnityEngine.Analytics.AnalyticsEvent,Unity.Analytics.StandardEvents";
  13. static Type s_StandardEventsType;
  14. // NOTICE: Update the UnityAds/link.xml file when you change these method names
  15. static string s_StandardEventsRegisterMethodName = "Register";
  16. static string s_StandardEventsUnregisterMethodName = "Unregister";
  17. static MethodInfo s_StandardEventsRegisterMethodInfo;
  18. static MethodInfo s_StandardEventsUnregisterMethodInfo;
  19. /// <summary>
  20. /// Collects extras before passing to Standard Events
  21. /// </summary>
  22. static IDictionary<string, object> s_StandardEventsExtras = new Dictionary<string, object>();
  23. /// <summary>
  24. /// Used by the event-sending pipeline of Standard Events
  25. /// </summary>
  26. static Action<IDictionary<string, object>> s_StandardEventsAction = eventData =>
  27. {
  28. foreach (var extra in s_StandardEventsExtras)
  29. {
  30. if (eventData.ContainsKey(extra.Key))
  31. {
  32. eventData.Remove(extra.Key);
  33. }
  34. eventData.Add(extra.Key, extra.Value);
  35. }
  36. };
  37. static bool InitializeStandardEvents()
  38. {
  39. try
  40. {
  41. if (s_StandardEventsType == null)
  42. {
  43. // Unity Analytics Standard Events class is named "AnalyticsEvent"
  44. // Is an optional component
  45. s_StandardEventsType = Type.GetType(s_StandardEventsClassName, true);
  46. if (s_StandardEventsType != null)
  47. {
  48. s_StandardEventsRegisterMethodInfo = s_StandardEventsType.GetMethod(s_StandardEventsRegisterMethodName, new Type[] { typeof(Action<IDictionary<string, object>>) });
  49. s_StandardEventsUnregisterMethodInfo = s_StandardEventsType.GetMethod(s_StandardEventsUnregisterMethodName, new Type[] { typeof(Action<IDictionary<string, object>>) });
  50. }
  51. }
  52. }
  53. catch (Exception e)
  54. {
  55. Debug.Log(e.Message);
  56. }
  57. return s_StandardEventsRegisterMethodInfo != null && s_StandardEventsUnregisterMethodInfo != null;
  58. }
  59. public static bool SetAnalyticsEventExtra(string jsonExtras)
  60. {
  61. bool finalResult = true;
  62. Dictionary<string, object> test = (Dictionary<string, object>)MiniJSON.Json.Deserialize(jsonExtras);
  63. foreach (KeyValuePair<string, object> entry in test)
  64. {
  65. Boolean result = SetAnalyticsEventExtra(entry.Key, entry.Value);
  66. if (!result)
  67. {
  68. finalResult = false;
  69. }
  70. }
  71. return finalResult;
  72. }
  73. /// <summary>
  74. /// Set a key/value pair as additional outgoing data from the Unity Analytics Standard Events
  75. /// AnalyticsEvent class.
  76. /// Supports multiple pairs if called repeatedly with unique keys.
  77. /// Supports updating when called repeatedly with non-unique key.
  78. /// Supports removal when value is null.
  79. /// </summary>
  80. /// <param name="key"></param>
  81. /// <param name="value"></param>
  82. /// <returns>false if setting or updating was not possible, potentially due to missing depen.</returns>
  83. public static Boolean SetAnalyticsEventExtra(string key, object value)
  84. {
  85. if (!InitializeStandardEvents())
  86. {
  87. return false;
  88. }
  89. if (s_StandardEventsExtras.ContainsKey(key))
  90. {
  91. s_StandardEventsExtras.Remove(key);
  92. }
  93. if (value != null)
  94. {
  95. s_StandardEventsExtras.Add(key, value);
  96. }
  97. try
  98. {
  99. // Avoid over-subscribing to this delegate
  100. s_StandardEventsUnregisterMethodInfo.Invoke(s_StandardEventsType, new[] { s_StandardEventsAction });
  101. // Subscribe to the delegate
  102. s_StandardEventsRegisterMethodInfo.Invoke(s_StandardEventsType, new[] { s_StandardEventsAction });
  103. }
  104. catch (Exception exception)
  105. {
  106. Debug.Log(exception.Message);
  107. }
  108. return true;
  109. }
  110. }
  111. }