把多个模型的网格合并为一个网格。可以使用自己写代码,使用Unity自带的CombineMeshes方法,也可以使用资源商店的插件,在资源商店搜Mesh Combine可以搜索到相关的插件,例如Easy Mesh Combine Tool等插件。
可大幅度减少Batches数量 减少模型的顶点、面、材质、骨骼、蒙皮网格。
写代码使用CombineMeshes方法实现网格合并:
1.测试脚本挂载在需要合并的物体身上
2.代码逻辑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MeshCombineTest : MonoBehaviour
{// Start is called before the first frame updatevoid 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.合并完成预览