在Hierachy中选中物体,那么它以及它的子物体的mesh,会合并成为一个mesh,并且保存到Project中,可以多选,选择几个物体就会生成几个合并的mesh
新建脚本MeshCombine放到Editor文件夹中
using System.IO;
using UnityEditor;
using UnityEngine;
public class MeshCombine
{
[MenuItem("Plugins/合并选择mesh")]
static void CombineMesh()
{
GameObject[] objs = Selection.gameObjects;
for (int j = 0; j < objs.Length; j++)
{
MeshFilter[] meshfilters = objs[j].GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshfilters.Length];
Matrix4x4 matrix = objs[j].transform.worldToLocalMatrix;
for (int i = 0; i < meshfilters.Length; i++)
{
MeshFilter mf = meshfilters[i];
MeshRenderer mr = mf.GetComponent<MeshRenderer>();
if (mr == null) continue;
combine[i].mesh = mf.sharedMesh;
combine[i].transform = matrix * mf.transform.localToWorldMatrix;
}
Mesh mesh = new Mesh();
mesh.name = objs[j].name;
mesh.CombineMeshes(combine, true);
string path = @"Assets/Model/Combinemesh/" + mesh.name + ".asset";
if (!Directory.Exists(@"Assets/Model/Combinemesh"))
{
Directory.CreateDirectory(@"Assets/Model/Combinemesh");
}
AssetDatabase.CreateAsset(mesh, path);
}
AssetDatabase.Refresh();
EditorUtility.DisplayDialog("CombineMesh", "Combine successfully!", "OK", "");
}
}
生成的mesh可在Model/Combinemesh文件夹下找到
注意事项:
1, 调用AssetDatabase.CreateAsset在project中创建一些东西的时候,要使用相对路径,不可以用绝对路径
正确示范 string path = @"Assets/Model/Combinemesh/" + mesh.name + ".asset";
错误示范 string path =Application.dataPath+ @"Model/Combinemesh/" + mesh.name + ".asset";
2,Unity的一个mesh,最多可以包含65536个定点,所以如果合并的mesh定点数超过65536的时候,会报错
原文:https://www.cnblogs.com/Damon-3707/p/12001106.html