Files
VR-WuKong/Assets/ThirdParty/Tools/CombineMeshs/Editor/CombineMeshsEditor.cs

117 lines
3.8 KiB
C#
Raw Normal View History

2025-11-14 18:44:06 +08:00
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!");
}
}