把多个模型的网格合并为一个网格。可以使用自己写代码,使用Unity自带的CombineMeshes方法,也可以使用资源商店的插件,在资源商店搜Mesh Combine可以搜索到相关的插件,例如Easy Mesh Combine Tool等插件。
可大幅度减少Batches数量 减少模型的顶点、面、材质、骨骼、蒙皮网格。
写代码使用CombineMeshes方法实现网格合并:
1.测试脚本挂载在需要合并的物体身上
2.代码逻辑
csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeshCombineTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
CombineTest();
}
public void CombineTest()
{
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
Material[] mats = new Material[meshFilters.Length];
Matrix4x4 matrix = transform.worldToLocalMatrix;
for (int i = 0; i < meshFilters.Length; i++)
{
MeshFilter mf = meshFilters[i];
MeshRenderer mr = meshFilters[i].GetComponent<MeshRenderer>();
if (mr == null)
{
continue;
}
combine[i].mesh = mf.sharedMesh;
combine[i].transform = mf.transform.localToWorldMatrix * matrix;
mr.enabled = false;
mats[i] = mr.sharedMaterial;
}
//新建一个物体 用来接收合并后的数据
GameObject go = new GameObject("NewGameobject");
go.AddComponent<MeshFilter>();
go.AddComponent<MeshRenderer>();
//赋值位置信息
go.transform.localPosition = transform.localPosition;
go.transform.localRotation = transform.localRotation;
//赋值合并后的网格
MeshFilter thisMeshFilter = go.GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mesh.name = "Combined";
thisMeshFilter.mesh = mesh;
mesh.CombineMeshes(combine, false);
//赋值合并后的材质信息
MeshRenderer thisMeshRenderer = go.GetComponent<MeshRenderer>();
thisMeshRenderer.sharedMaterials = mats;
thisMeshRenderer.enabled = true;
MeshCollider thisMeshCollider = GetComponent<MeshCollider>();
if (thisMeshCollider != null)
{
thisMeshCollider.sharedMesh = mesh;
}
//合并后隐藏自己
gameObject.SetActive(false);
}
}
3.最终结果展示
合并后物体属性的展示
使用Easy Mesh Combine Tool插件实现网格合并:
1.打开unity资源商店 搜索Mesh Combine 添加插件到我的资源
2.打开Package Manager 找到这个插件点击右下角Download
3.下载完毕点击导入
4.把需要合并的物体放在一个空节点下
5.打开插件 Window-->Easy Mesh Combine Tool 选中需要合并的物体点击插件面板的Make Group and Combine进行网格合并
6.合并完成预览