using System; using System.Collections.Generic; using System.Linq; using UnityEngine.Analytics; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using UnityEditor.Build; using UnityEditor.Build.Reporting; namespace UnityEditor.Rendering.Universal { class UniversalAnalytics : IPostprocessBuildWithReport { const int k_MaxEventsPerHour = 1000; const int k_MaxNumberOfElements = 1000; const string k_VendorKey = "unity.universal"; const string k_EventName = "uUniversalRenderPipelineUsage"; [AnalyticInfo(eventName: k_EventName, vendorKey: k_VendorKey, maxEventsPerHour: k_MaxEventsPerHour, maxNumberOfElements: k_MaxNumberOfElements)] class Analytic : IAnalytic { public bool TryGatherData(out IAnalytic.IData data, out Exception error) { data = null; UniversalRenderPipelineAsset rendererAsset = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; if (rendererAsset != null) { ScriptableRendererData[] rendererDataList = rendererAsset.m_RendererDataList; string mainLightMode = rendererAsset.mainLightRenderingMode.ToString(); string additionalLightMode = rendererAsset.additionalLightsRenderingMode.ToString(); HashSet rendererDatas = new HashSet(); HashSet renderFeatures = new HashSet(); int rendererDataAmount = 0; int rendererFeaturesAmount = 0; foreach (ScriptableRendererData rendererData in rendererDataList) { if (rendererData != null) { rendererDataAmount++; rendererDatas.Add(rendererData.GetType().ToString()); foreach (ScriptableRendererFeature rendererFeature in rendererData.rendererFeatures) { if (rendererFeature != null) { rendererFeaturesAmount++; renderFeatures.Add(rendererFeature.GetType().ToString()); } } } } data = new AnalyticsData() { renderer_data = rendererDatas.ToArray(), renderer_data_amount = rendererDataAmount, renderer_features = renderFeatures.ToArray(), renderer_features_amount = rendererFeaturesAmount, main_light_rendering_mode = mainLightMode, additional_light_rendering_mode = additionalLightMode, }; } error = null; return true; } [Serializable] struct AnalyticsData : IAnalytic.IData { public string[] renderer_data; public int renderer_data_amount; public string[] renderer_features; public int renderer_features_amount; public string main_light_rendering_mode; public string additional_light_rendering_mode; } } static void SendUniversalEvent() { //The event shouldn't be able to report if this is disabled but if we know we're not going to report //Lets early out and not waste time gathering all the data if (!EditorAnalytics.enabled) return; Analytic analytic = new Analytic(); EditorAnalytics.SendAnalytic(analytic); } public int callbackOrder { get; } public void OnPostprocessBuild(BuildReport report) { SendUniversalEvent(); } } }