手动合批方法
- 生成新的合批后的模型后要隐藏原有的模型,以免两个模型重叠显示。
1
2
3
4
5
6
7
8
9
10
// CombineInstances 承载了所有需要合并的数据,包括网格,子网格,世界坐标矩阵等...
CombineInstance[] combineInstances = new CombineInstance[meshFiltersToCombine.Count];
for(int i = 0 ; i< meshFiltersToCombine.Count ; i++)
{
// combineInstance 是个 struct,可以直接赋值,不需要new
combineInstances[i].mesh = meshFiltersToCombine[i].sharedMesh;
combineInstances[i].transform = meshFiltersToCombine[i].transform.localToWorldMatrix;
combineInstances[i].subMeshIndex = i; // 标识Material的索引位置,可以为0、1、2等
}
meshFilterCombined.sharedMesh.CombineMeshes(combineInstances, true, true);
手动合批需要满足的条件
- 需要合并的模型需要选中 [[read/write]]。
- 合批的模型距离不要太远,不能太大,以防CPU裁剪失效。
- 要求模型使用相同的材质球。
- 手动合并网格之后,Unity不能单独 Cull 其中的子网格;如果合并之后的网格有一部分在屏幕上,则Unity会绘制整个合并的Mesh。
手动拼接网格的缺点
- 拼接网格时可能会有卡顿的情况。