81 lines
3.0 KiB
C#
81 lines
3.0 KiB
C#
|
|
using System;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.Linq;
|
||
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
namespace Content.PolygonAncientEmpire.Optimized
|
||
|
|
{
|
||
|
|
public class SorterByMaterial : MonoBehaviour
|
||
|
|
{
|
||
|
|
public List<Material> indexation = new List<Material>();
|
||
|
|
|
||
|
|
[ContextMenu("SortObjectsBy")]
|
||
|
|
public void SortAllObjectsByMaterial()
|
||
|
|
{
|
||
|
|
Dictionary<string, GameObject> objects = new Dictionary<string, GameObject>();
|
||
|
|
List<MeshRenderer> renderers = 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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
[ContextMenu("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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|