Files
Zombie/Assets/Editor/MeshCombineTool.cs

64 lines
2.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
public class MeshCombineTool : MonoBehaviour
{
[MenuItem("Tools/Mesh/Combine Selected Meshes")]
static void CombineMeshes()
{
GameObject[] selectedObjects = Selection.gameObjects;
if (selectedObjects.Length == 0)
{
Debug.LogWarning("请选择至少一个带 MeshRenderer 的物体!");
return;
}
// 用于合批的 MeshCombineInstance 列表
List<CombineInstance> combineInstances = new List<CombineInstance>();
Material sharedMaterial = null;
foreach (GameObject obj in selectedObjects)
{
MeshFilter mf = obj.GetComponent<MeshFilter>();
MeshRenderer mr = obj.GetComponent<MeshRenderer>();
if (mf == null || mr == null)
continue;
if (sharedMaterial == null)
sharedMaterial = mr.sharedMaterial;
if (mr.sharedMaterial != sharedMaterial)
{
Debug.LogWarning("存在不同材质的物体,合并后只保留第一种材质!");
}
CombineInstance ci = new CombineInstance();
ci.mesh = mf.sharedMesh;
ci.transform = obj.transform.localToWorldMatrix;
combineInstances.Add(ci);
}
if (combineInstances.Count == 0)
{
Debug.LogWarning("未找到可合并的 Mesh");
return;
}
// 创建新 Mesh
Mesh combinedMesh = new Mesh();
combinedMesh.CombineMeshes(combineInstances.ToArray());
// 创建新 GameObject
GameObject combinedObj = new GameObject("CombinedMesh");
MeshFilter newMF = combinedObj.AddComponent<MeshFilter>();
MeshRenderer newMR = combinedObj.AddComponent<MeshRenderer>();
newMF.sharedMesh = combinedMesh;
newMR.sharedMaterial = sharedMaterial;
Debug.Log("合并完成,共合并 " + combineInstances.Count + " 个物体!");
}
}