112 lines
4.2 KiB
C#
Raw Normal View History

2025-09-06 17:17:39 +04:00
using System;
using System.Collections.Generic;
using System.Linq;
using NaughtyAttributes;
using UnityEngine;
namespace Util.Mesh
{
public class ModelLoad : MonoBehaviour
{
public List<Material> indexation = new List<Material>();
[Button("Sort Inside Objects By Materials")]
public void SortInsideObjectsByMaterials()
{
Dictionary<string, GameObject> objects = new Dictionary<string, GameObject>();
List<MeshRenderer> renderers = gameObject.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;
}
}
}
[Button("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;
}
}
}
[Button("SortObjectsByMaterialsTwo")]
public void SortObjectsByMaterialTwo()
{
Dictionary<Material, GameObject> materialGroups = new Dictionary<Material, GameObject>();
Renderer[] renderers = FindObjectsOfType<Renderer>();
foreach (Renderer renderer in renderers)
{
if (renderer.sharedMaterial == null)
{
Debug.LogWarning($"Об'єкт {renderer.gameObject.name} не має матеріалу.");
continue;
}
Material material = renderer.sharedMaterial;
if (!materialGroups.ContainsKey(material))
{
GameObject materialGroup = new GameObject(material.name + "_Group");
materialGroup.transform.parent = null; // Робимо цей об'єкт кореневим
materialGroups[material] = materialGroup;
}
renderer.transform.parent = materialGroups[material].transform;
}
Debug.Log("Сортування об'єктів за матеріалами завершено.");
}
}
}