using System; using UnityEditor; using UnityEngine.Analytics; namespace Unity.VisualScripting { public sealed class UsageAnalytics { const int k_MaxEventsPerHour = 1000; const int k_MaxNumberOfElements = 1000; const string k_VendorKey = "unity.bolt"; const string k_EventName = "BoltUsage"; #if !UNITY_2023_2_OR_NEWER static bool isRegistered = false; #endif internal static void CollectAndSendForType(string[] paths) { if (!EditorAnalytics.enabled || !VSUsageUtility.isVisualScriptingUsed) return; foreach (string path in paths) { Type assetType = AssetDatabase.GetMainAssetTypeAtPath(path); if (assetType == typeof(T)) { CollectAndSend(); return; } } } #if UNITY_2023_2_OR_NEWER public static void CollectAndSend() { if (!EditorAnalytics.enabled || !VSUsageUtility.isVisualScriptingUsed) return; EditorAnalytics.SendAnalytic(new UsageAnalytic(CollectData())); } #else public static void CollectAndSend() { if (!EditorAnalytics.enabled || !VSUsageUtility.isVisualScriptingUsed) return; if (!RegisterEvent()) return; var data = CollectData(); EditorAnalytics.SendEventWithLimit(k_EventName, data); } private static bool RegisterEvent() { if (!isRegistered) { var result = EditorAnalytics.RegisterEventWithLimit(k_EventName, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey); if (result == UnityEngine.Analytics.AnalyticsResult.Ok) { isRegistered = true; } } return isRegistered; } #endif private static UsageAnalyticsData CollectData() { var data = new UsageAnalyticsData { productVersion = BoltProduct.instance.version.ToString(), }; return data; } #if UNITY_2023_2_OR_NEWER [AnalyticInfo(eventName: k_EventName, vendorKey: k_VendorKey, maxEventsPerHour:k_MaxEventsPerHour, maxNumberOfElements:k_MaxNumberOfElements)] class UsageAnalytic : IAnalytic { private UsageAnalyticsData data; public UsageAnalytic(UsageAnalyticsData data) { this.data = data; } public bool TryGatherData(out IAnalytic.IData data, out Exception error) { error = null; data = this.data; return data != null; } } private struct UsageAnalyticsData: IAnalytic.IData #else private struct UsageAnalyticsData #endif { public string productVersion; } } }