127 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			127 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Reflection; | ||
|  | 
 | ||
|  | namespace UnityEngine.Monetization | ||
|  | { | ||
|  |     /// <summary> | ||
|  |     /// Decorates Unity Analytics "Standard Events" with extras for correlating events to our game and advertising IDs. | ||
|  |     /// </summary> | ||
|  |     static class Analytics | ||
|  |     { | ||
|  |         // See also https://gitlab.internal.unity3d.com/upm-packages/analytics/com.unity.analytics | ||
|  |         static string s_StandardEventsClassName = "UnityEngine.Analytics.AnalyticsEvent,Unity.Analytics.StandardEvents"; | ||
|  |         static Type s_StandardEventsType; | ||
|  |         // NOTICE: Update the UnityAds/link.xml file when you change these method names | ||
|  |         static string s_StandardEventsRegisterMethodName = "Register"; | ||
|  |         static string s_StandardEventsUnregisterMethodName = "Unregister"; | ||
|  |         static MethodInfo s_StandardEventsRegisterMethodInfo; | ||
|  |         static MethodInfo s_StandardEventsUnregisterMethodInfo; | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Collects extras before passing to Standard Events | ||
|  |         /// </summary> | ||
|  |         static IDictionary<string, object> s_StandardEventsExtras = new Dictionary<string, object>(); | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Used by the event-sending pipeline of Standard Events | ||
|  |         /// </summary> | ||
|  |         static Action<IDictionary<string, object>> s_StandardEventsAction = eventData => | ||
|  |         { | ||
|  |             foreach (var extra in s_StandardEventsExtras) | ||
|  |             { | ||
|  |                 if (eventData.ContainsKey(extra.Key)) | ||
|  |                 { | ||
|  |                     eventData.Remove(extra.Key); | ||
|  |                 } | ||
|  | 
 | ||
|  |                 eventData.Add(extra.Key, extra.Value); | ||
|  |             } | ||
|  |         }; | ||
|  | 
 | ||
|  |         static bool InitializeStandardEvents() | ||
|  |         { | ||
|  |             try | ||
|  |             { | ||
|  |                 if (s_StandardEventsType == null) | ||
|  |                 { | ||
|  |                     // Unity Analytics Standard Events class is named "AnalyticsEvent" | ||
|  |                     // Is an optional component | ||
|  |                     s_StandardEventsType = Type.GetType(s_StandardEventsClassName, true); | ||
|  | 
 | ||
|  |                     if (s_StandardEventsType != null) | ||
|  |                     { | ||
|  |                         s_StandardEventsRegisterMethodInfo = s_StandardEventsType.GetMethod(s_StandardEventsRegisterMethodName, new Type[] { typeof(Action<IDictionary<string, object>>) }); | ||
|  |                         s_StandardEventsUnregisterMethodInfo = s_StandardEventsType.GetMethod(s_StandardEventsUnregisterMethodName, new Type[] { typeof(Action<IDictionary<string, object>>) }); | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |             catch (Exception e) | ||
|  |             { | ||
|  |                 Debug.Log(e.Message); | ||
|  |             } | ||
|  | 
 | ||
|  |             return s_StandardEventsRegisterMethodInfo != null && s_StandardEventsUnregisterMethodInfo != null; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool SetAnalyticsEventExtra(string jsonExtras) | ||
|  |         { | ||
|  |             bool finalResult = true; | ||
|  |             Dictionary<string, object> test = (Dictionary<string, object>)MiniJSON.Json.Deserialize(jsonExtras); | ||
|  |             foreach (KeyValuePair<string, object> entry in test) | ||
|  |             { | ||
|  |                 Boolean result = SetAnalyticsEventExtra(entry.Key, entry.Value); | ||
|  |                 if (!result) | ||
|  |                 { | ||
|  |                     finalResult = false; | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             return finalResult; | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// Set a key/value pair as additional outgoing data from the Unity Analytics Standard Events | ||
|  |         /// AnalyticsEvent class. | ||
|  |         /// Supports multiple pairs if called repeatedly with unique keys. | ||
|  |         /// Supports updating when called repeatedly with non-unique key. | ||
|  |         /// Supports removal when value is null. | ||
|  |         /// </summary> | ||
|  |         /// <param name="key"></param> | ||
|  |         /// <param name="value"></param> | ||
|  |         /// <returns>false if setting or updating was not possible, potentially due to missing depen.</returns> | ||
|  |         public static Boolean SetAnalyticsEventExtra(string key, object value) | ||
|  |         { | ||
|  |             if (!InitializeStandardEvents()) | ||
|  |             { | ||
|  |                 return false; | ||
|  |             } | ||
|  | 
 | ||
|  |             if (s_StandardEventsExtras.ContainsKey(key)) | ||
|  |             { | ||
|  |                 s_StandardEventsExtras.Remove(key); | ||
|  |             } | ||
|  | 
 | ||
|  |             if (value != null) | ||
|  |             { | ||
|  |                 s_StandardEventsExtras.Add(key, value); | ||
|  |             } | ||
|  | 
 | ||
|  |             try | ||
|  |             { | ||
|  |                 // Avoid over-subscribing to this delegate | ||
|  |                 s_StandardEventsUnregisterMethodInfo.Invoke(s_StandardEventsType, new[] { s_StandardEventsAction }); | ||
|  | 
 | ||
|  |                 // Subscribe to the delegate | ||
|  |                 s_StandardEventsRegisterMethodInfo.Invoke(s_StandardEventsType, new[] { s_StandardEventsAction }); | ||
|  |             } | ||
|  |             catch (Exception exception) | ||
|  |             { | ||
|  |                 Debug.Log(exception.Message); | ||
|  |             } | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  |     } | ||
|  | } |