unity网格合并的用法
首先什么网格合并:多个mesh合并为一个mesh
有啥用:通俗来说就是GUP一小口一小口吃变成大口大口吃
两种方法:
1.自动合并网格
上一篇说了unity静态批处理和动态批处理
地址:https://blog.youkuaiyun.com/sakura_02/article/details/102515486
提到了勾选Static的GameObject下的Mesh都会被合入CombineMesh(无论什么材质),且每个Mesh都作为子网格存在,自动合并网格后,会根据材质是否相同来合批降低DrawCall,是内存换性能的方法
介绍一篇比较好的帖子,提到静态合批包大小的问题
https://blog.youkuaiyun.com/liweizhao/article/details/81937729
2.手动网格合并
手动合并网格可以按照我们的需求将多个mesh合并为一个mesh交给GPU处理,
实操一下,建一个脚本
附上代码:
using UnityEngine;
using System.Collections;
public class CombineMeshes : MonoBehaviour
{
void Start()
{
//获取MeshRender;
MeshRenderer[] meshRenders = GetComponentsInChildren<MeshRenderer>();
//材质;
Material[] mats = new Material[meshRenders.Length];
for (int i = 0; i < meshRenders.Length; i++)
{
mats[i] = meshRenders[i].sharedMaterial;
}
//合并Mesh;
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
for (int i = 0; i < meshFilters.Length; i++)
{
combine[i].mesh = meshFilters[i].sharedMesh;
combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
Destroy(meshFilters[i].gameObject);
}
MeshRenderer mr = gameObject.AddComponent<MeshRenderer>();
MeshFilter mf = gameObject.AddComponent<MeshFilter>();
mf.mesh = new Mesh();
mf.mesh.CombineMeshes(combine, false);
mr.sharedMaterials = mats;
gameObject.SetActive(true);
}
}

新建一个Cube和Sphere放在空对象Root下,Root挂上上面的脚本,运行
可以看到root多了两个组件MeshFilter和MeshRender,Root下的对象被Destory了,但是Game视图中还是能看到,因为我们把cube和sphere的mesh合并到了一起,并在MeshRender里赋予了材质,所以即使销毁了还是能看见

这个是合并后的网格,有两个子网格submeshes,
注意一点,手动合并网格的时候不能把对象勾选为静态,勾选为静态后表明该对象会自动合并网格,手动合并就不起作用,大家可以试试看
1507

被折叠的 条评论
为什么被折叠?



