using System; using System.Collections.Generic; using System.Linq; using NaughtyAttributes; using UnityEngine; namespace Util.Mesh { public class ModelLoad : MonoBehaviour { public List indexation = new List(); [Button("Sort Inside Objects By Materials")] public void SortInsideObjectsByMaterials() { Dictionary objects = new Dictionary(); List renderers = gameObject.transform.GetComponentsInChildren().ToList(); foreach (var mesh in renderers) { var materials = mesh.sharedMaterials; List el = new List(); 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 objects = new Dictionary(); List renderers = new List(); for (int i = 0; i < transform.childCount; i++) { Transform child = transform.GetChild(i); try { var mesh = child.GetComponent(); if (mesh) renderers.Add(mesh); } catch (Exception e) { Debug.Log(e.Message); } } foreach (var mesh in renderers) { var materials = mesh.sharedMaterials; List el = new List(); 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 materialGroups = new Dictionary(); Renderer[] renderers = FindObjectsOfType(); 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("Сортування об'єктів за матеріалами завершено."); } } }