117 lines
3.8 KiB
C#
117 lines
3.8 KiB
C#
|
|
using System;
|
||
|
|
using System.Collections;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.Linq;
|
||
|
|
using UnityEditor;
|
||
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
[CustomEditor(typeof(CombineMeshs))]
|
||
|
|
public class CombineMeshsEditor : Editor
|
||
|
|
{
|
||
|
|
CombineMeshs inst;
|
||
|
|
|
||
|
|
private void OnEnable()
|
||
|
|
{
|
||
|
|
inst = (CombineMeshs)target;
|
||
|
|
}
|
||
|
|
|
||
|
|
public override void OnInspectorGUI()
|
||
|
|
{
|
||
|
|
base.OnInspectorGUI();
|
||
|
|
|
||
|
|
//
|
||
|
|
if(GUILayout.Button("CombineMeshs", GUILayout.Height(50)))
|
||
|
|
{
|
||
|
|
if(!inst.isCombineSubmesh)
|
||
|
|
{
|
||
|
|
AAA();
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
AAB();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void AAA()
|
||
|
|
{
|
||
|
|
List< CombineInstance > combineInstances = new List< CombineInstance >();
|
||
|
|
List<Material> materials = new List< Material >();
|
||
|
|
foreach(Transform t in inst.root.GetComponent<Transform>())
|
||
|
|
{
|
||
|
|
if(t.gameObject.activeSelf && t.GetComponent<MeshFilter>())
|
||
|
|
{
|
||
|
|
CombineInstance combineInstance = new CombineInstance();
|
||
|
|
|
||
|
|
combineInstance.mesh = t.GetComponent<MeshFilter>().sharedMesh;
|
||
|
|
combineInstance.transform = inst.root.worldToLocalMatrix * t.localToWorldMatrix;
|
||
|
|
combineInstances.Add(combineInstance);
|
||
|
|
|
||
|
|
materials.AddRange(t.GetComponent<MeshRenderer>().sharedMaterials);
|
||
|
|
|
||
|
|
t.gameObject.SetActive(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Mesh mesh = new Mesh();
|
||
|
|
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
|
||
|
|
mesh.CombineMeshes(combineInstances.ToArray(), false);
|
||
|
|
|
||
|
|
GameObject obj = new GameObject();
|
||
|
|
obj.transform.position = inst.root.transform.position;
|
||
|
|
obj.transform.SetParent(inst.root.transform);
|
||
|
|
obj.AddComponent<MeshFilter>();
|
||
|
|
obj.AddComponent<MeshRenderer>();
|
||
|
|
|
||
|
|
obj.GetComponent<MeshFilter>().sharedMesh = mesh;
|
||
|
|
obj.GetComponent<MeshRenderer>().sharedMaterials = materials.ToArray();
|
||
|
|
}
|
||
|
|
|
||
|
|
void AAB()
|
||
|
|
{
|
||
|
|
List<CombineInstance> combineInstances = new List<CombineInstance>();
|
||
|
|
List<Material> materials = new List<Material>();
|
||
|
|
foreach (Transform t in inst.root.GetComponentsInChildren<Transform>())
|
||
|
|
{
|
||
|
|
if (t.gameObject.activeSelf && t.GetComponent<MeshFilter>() && t.GetComponent<MeshFilter>().sharedMesh)
|
||
|
|
{
|
||
|
|
CombineInstance combineInstance = new CombineInstance();
|
||
|
|
|
||
|
|
for (int i = 0; i < t.GetComponent<MeshFilter>().sharedMesh.subMeshCount; ++i)
|
||
|
|
{
|
||
|
|
combineInstance.mesh = t.GetComponent<MeshFilter>().sharedMesh;
|
||
|
|
combineInstance.transform = inst.root.worldToLocalMatrix * t.localToWorldMatrix;
|
||
|
|
combineInstance.subMeshIndex = i;
|
||
|
|
combineInstances.Add(combineInstance);
|
||
|
|
}
|
||
|
|
|
||
|
|
//
|
||
|
|
for (int i = 0; i < t.GetComponent<MeshRenderer>().sharedMaterials.Length; ++i)
|
||
|
|
{
|
||
|
|
if (!materials.Contains(t.GetComponent<MeshRenderer>().sharedMaterials[i]))
|
||
|
|
{
|
||
|
|
materials.Add(t.GetComponent<MeshRenderer>().sharedMaterials[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
t.gameObject.SetActive(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Mesh mesh = new Mesh();
|
||
|
|
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
|
||
|
|
mesh.CombineMeshes(combineInstances.ToArray(), true);
|
||
|
|
|
||
|
|
GameObject obj = new GameObject();
|
||
|
|
obj.transform.position = inst.root.transform.position;
|
||
|
|
obj.transform.SetParent(inst.root.transform);
|
||
|
|
obj.AddComponent<MeshFilter>();
|
||
|
|
obj.AddComponent<MeshRenderer>();
|
||
|
|
|
||
|
|
obj.GetComponent<MeshFilter>().sharedMesh = mesh;
|
||
|
|
obj.GetComponent<MeshRenderer>().sharedMaterials = materials.ToArray();
|
||
|
|
|
||
|
|
Debug.Log("Done!");
|
||
|
|
}
|
||
|
|
}
|