TG9six 03a642d635 first push
first push
2025-09-06 17:17:39 +04:00

81 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Content.PolygonAncientEmpire.Optimized
{
public class SorterByMaterial : MonoBehaviour
{
public List<Material> indexation = new List<Material>();
[ContextMenu("SortObjectsBy")]
public void SortAllObjectsByMaterial()
{
Dictionary<string, GameObject> objects = new Dictionary<string, GameObject>();
List<MeshRenderer> renderers = transform.GetComponentsInChildren<MeshRenderer>().ToList();
foreach (var mesh in renderers)
{
var materials = mesh.sharedMaterials;
List<int> el = new List<int>();
foreach (var mat in materials)
el.Add(indexation.IndexOf(mat));
el.Sort();
var nameOfRoot = "Mat:";
foreach (var index in el)
nameOfRoot += $" {index}";
if (objects.TryGetValue(nameOfRoot, out var rooted))
mesh.gameObject.transform.parent = rooted.transform;
else
{
GameObject materialGroup = new GameObject(nameOfRoot);
materialGroup.transform.parent = transform;
objects.Add(nameOfRoot, materialGroup);
mesh.gameObject.transform.parent = materialGroup.transform;
}
}
}
[ContextMenu("SortObjectsByMaterials")]
public void SortObjectsByMaterial()
{
Dictionary<string, GameObject> objects = new Dictionary<string, GameObject>();
List<MeshRenderer> renderers = new List<MeshRenderer>();
for (int i = 0; i < transform.childCount; i++)
{
Transform child = transform.GetChild(i);
try
{
var mesh = child.GetComponent<MeshRenderer>();
if (mesh) renderers.Add(mesh);
}
catch (Exception e)
{
Debug.Log(e.Message);
}
}
foreach (var mesh in renderers)
{
var materials = mesh.sharedMaterials;
List<int> el = new List<int>();
foreach (var mat in materials)
el.Add(indexation.IndexOf(mat));
el.Sort();
var nameOfRoot = "Mat:";
foreach (var index in el)
nameOfRoot += $" {index}";
if (objects.TryGetValue(nameOfRoot, out var rooted))
mesh.gameObject.transform.parent = rooted.transform;
else
{
GameObject materialGroup = new GameObject(nameOfRoot);
materialGroup.transform.parent = transform;
objects.Add(nameOfRoot, materialGroup);
mesh.gameObject.transform.parent = materialGroup.transform;
}
}
}
}
}