UP-Viagg-io/Viagg-io/Assets/SceneProfiler/Editor/CollectExpensiveObject.cs
2025-05-08 10:30:32 +02:00

92 lines
2.9 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace SceneProfiler.Editor
{
public class CollectExpensiveObject
{
private SceneProfiler _sceneProfiler;
private const int HierarchyDepthThreshold = 7;
private const int ComponentCountThreshold = 5;
public CollectExpensiveObject(SceneProfiler sceneProfiler)
{
_sceneProfiler = sceneProfiler;
}
public void CollectData()
{
_sceneProfiler.ActiveExpensiveObjects.Clear();
List<GameObject> allObjects = _sceneProfiler.FindAllGameObjects();
foreach (GameObject obj in allObjects)
{
if (obj == null) continue;
if (obj.transform.localScale != Vector3.one)
{
AddExpensiveObjectDetails(obj, "Scale");
}
}
foreach (GameObject obj in allObjects)
{
if (obj == null) continue;
if (GetHierarchyDepth(obj.transform) > HierarchyDepthThreshold)
{
AddExpensiveObjectDetails(obj, "Hierarchy");
}
}
foreach (GameObject obj in allObjects)
{
if (obj == null) continue;
if (obj.GetComponents<Component>().Length > ComponentCountThreshold)
{
AddExpensiveObjectDetails(obj, "Components");
}
}
}
private void AddExpensiveObjectDetails(GameObject obj, string type)
{
ExpensiveObjectDetails details = new ExpensiveObjectDetails(obj);
switch (type)
{
case "Scale":
details.scaleType = IsUniformScale(obj.transform.localScale) ? "Uniform" : "NonUniform";
details.scale = obj.transform.localScale;
break;
case "Hierarchy":
details.hierarchyDepth = GetHierarchyDepth(obj.transform);
break;
case "Components":
details.componentCount = obj.GetComponents<Component>().Length;
break;
}
if (!_sceneProfiler.ActiveExpensiveObjects.Contains(details))
{
_sceneProfiler.ActiveExpensiveObjects.Add(details);
}
}
private bool IsUniformScale(Vector3 scale)
{
return Mathf.Approximately(scale.x, scale.y) && Mathf.Approximately(scale.y, scale.z);
}
private int GetHierarchyDepth(Transform transform)
{
int depth = 0;
while (transform.parent != null)
{
depth++;
transform = transform.parent;
}
return depth;
}
}
}