Firstborn/Library/PackageCache/com.unity.shadergraph@12.1.8/Editor/ShaderGraphAnalytics.cs

85 lines
2.6 KiB
C#
Raw Normal View History

2023-03-28 13:24:16 -04:00
using System.Collections.Generic;
using System.Linq;
using UnityEngine.Analytics;
using UnityEngine;
namespace UnityEditor.ShaderGraph
{
class ShaderGraphAnalytics
{
static bool s_EventRegistered = false;
const int k_MaxEventsPerHour = 1000;
const int k_MaxNumberOfElements = 1000;
const string k_VendorKey = "unity.shadergraph";
const string k_EventName = "uShaderGraphUsage";
static bool EnableAnalytics()
{
AnalyticsResult result = EditorAnalytics.RegisterEventWithLimit(k_EventName, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey);
if (result == AnalyticsResult.Ok)
s_EventRegistered = true;
return s_EventRegistered;
}
struct AnalyticsData
{
public string nodes;
public int node_count;
public string asset_guid;
public int subgraph_count;
}
public static void SendShaderGraphEvent(string assetGuid, GraphData graph)
{
//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;
if (!EnableAnalytics())
return;
Dictionary<string, int> nodeTypeAndCount = new Dictionary<string, int>();
var nodes = graph.GetNodes<AbstractMaterialNode>();
int subgraphCount = 0;
foreach (var materialNode in nodes)
{
string nType = materialNode.GetType().ToString().Split('.').Last();
if (nType == "SubGraphNode")
{
subgraphCount += 1;
}
if (!nodeTypeAndCount.ContainsKey(nType))
{
nodeTypeAndCount[nType] = 1;
}
else
{
nodeTypeAndCount[nType] += 1;
}
}
var jsonRepr = DictionaryToJson(nodeTypeAndCount);
var data = new AnalyticsData()
{
nodes = jsonRepr,
node_count = nodes.Count(),
asset_guid = assetGuid,
subgraph_count = subgraphCount
};
EditorAnalytics.SendEventWithLimit(k_EventName, data);
}
static string DictionaryToJson(Dictionary<string, int> dict)
{
var entries = dict.Select(d => $"\"{d.Key}\":{string.Join(",", d.Value)}");
return "{" + string.Join(",", entries) + "}";
}
}
}