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 combineInstances = new List(); Material sharedMaterial = null; foreach (GameObject obj in selectedObjects) { MeshFilter mf = obj.GetComponent(); MeshRenderer mr = obj.GetComponent(); 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(); MeshRenderer newMR = combinedObj.AddComponent(); newMF.sharedMesh = combinedMesh; newMR.sharedMaterial = sharedMaterial; Debug.Log("合并完成,共合并 " + combineInstances.Count + " 个物体!"); } }