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