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

112 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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("Сортування об'єктів за матеріалами завершено.");
}
}
}