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