64 lines
2.0 KiB
C#
64 lines
2.0 KiB
C#
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 + " 个物体!");
|
||
}
|
||
} |