using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace Content.PolygonAncientEmpire.Optimized { public class SorterByMaterial : MonoBehaviour { public List indexation = new List(); [ContextMenu("SortObjectsBy")] public void SortAllObjectsByMaterial() { Dictionary objects = new Dictionary(); List renderers = 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; } } } [ContextMenu("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; } } } } }