using System.Collections.Generic; using JetBrains.Annotations; using System.Diagnostics.CodeAnalysis; using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Analytics; using System; namespace UnityEditor.Rendering.Analytics { // schema = com.unity3d.data.schemas.editor.analytics.uVolumeProfileOverridesAnalytic_v2 // taxonomy = editor.analytics.uVolumeProfileOverridesAnalytic.v2 internal class VolumeProfileOverridesAnalytic : IPostprocessBuildWithReport { public int callbackOrder => int.MaxValue; [AnalyticInfo(eventName: "uVolumeProfileOverridesAnalytic", version: 2, maxEventsPerHour:1000, vendorKey: "unity.srp")] public class Analytic : IAnalytic { public Analytic(string asset_guid, string type, string[] p) { m_Data = new Data { volume_profile_asset_guid = asset_guid, component_type = type, overrided_parameters = p }; } [System.Diagnostics.DebuggerDisplay("{volume_profile_asset_guid} - {component_type} - {overrided_parameters.Length}")] [Serializable] struct Data : IAnalytic.IData { // Naming convention for analytics data public string volume_profile_asset_guid; public string component_type; public string[] overrided_parameters; } public bool TryGatherData(out IAnalytic.IData data, out Exception error) { data = m_Data; error = null; return true; } Data m_Data; } void IPostprocessBuildWithReport.OnPostprocessBuild(BuildReport _) { SendAnalytic(); } private static readonly string[] k_SearchFolders = new[] { "Assets" }; [MustUseReturnValue] static bool TryGatherData([NotNullWhen(true)] out List datas, [NotNullWhen(false)] out string warning) { warning = string.Empty; datas = new List(); var volumeProfileGUIDs = AssetDatabase.FindAssets($"t:{nameof(VolumeProfile)} glob:\"**/*.asset\"", k_SearchFolders); foreach (var guid in volumeProfileGUIDs) { var volumeProfile = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); if (volumeProfile == null) continue; foreach (var volumeComponent in volumeProfile.components) { var volumeComponentType = volumeComponent.GetType(); var defaultVolumeComponent = (VolumeComponent) ScriptableObject.CreateInstance(volumeComponentType); var overrideParameters = volumeComponent.ToNestedColumnWithDefault(defaultVolumeComponent, true); if (overrideParameters.Length == 0) continue; datas.Add(new Analytic(guid, volumeComponent.GetType().Name, overrideParameters)); } } return true; } [MenuItem("internal:Edit/Rendering/Analytics/Send VolumeProfileOverridesAnalytic ", priority = 1)] static void SendAnalytic() { if (!TryGatherData(out var data, out var warning)) Debug.Log(warning); data.ForEach(d => AnalyticsUtils.SendData(d)); } } }