Mesh合并

在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的时候,会报错

猜你喜欢

转载自www.cnblogs.com/Damon-3707/p/12001106.html