今天介绍一个优化技巧,Mesh合并
众所周知,我们创建的3D游戏物体,是通过MeshFilter 和 MeshRenderer来进行显示
其中MeshFilter 来控制物体的样子
MeshRenderer 来控制游戏的显示效果
如图所示,我们用四个Cube来拼搭一个简单的场景:
这里我们要知道,场景中的模型物体,都是由一个一个三角形面片组成的,
这样的话我们的场景中其实包含了大量三角形面片和顶点信息
物体多的话,对我们游戏运行会产生一定影响,
如果将这些游戏物体的mesh进行融合,就可大量减少场景中三角形面片和顶点的数量
然后现在是我们的代码部分:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class MeshTool {
[MenuItem("Tool/Mesh/Combine")]
public static void MeshCombine()
{
GameObject obj = (GameObject)Selection.activeObject; //场景中选择的物体
MeshFilter[] filters = obj.GetComponentsInChildren<MeshFilter>(); // 获取子物体的MeshFilter
CombineInstance[] combiners = new CombineInstance[filters.Length]; // 根据子物体的MeshFilter数量来创建CombineInstance数组
for (int i = 0; i < filters.Length; i++)
{
combiners[i].mesh = filters[i].sharedMesh;
combiners[i].transform = filters[i].transform.localToWorldMatrix; // 这里其实不是transform 组件上的transform,其实算是一种作表转换
}
Mesh finalMesh = new Mesh(); // 创建一个新的mesh
finalMesh.CombineMeshes(combiners);// 将数组中的mesh合并到finalMesh这一个数组中
obj.GetComponent<MeshFilter>().sharedMesh = finalMesh;// 赋值
Mesh mesh = obj.GetComponent<MeshFilter>().sharedMesh;
AssetDatabase.CreateAsset(mesh, "Assets/" + "test" + ".asset"); // 将新的mesh 信息保存到本地
}
}
在项目中找创建Editor文件夹,然后创建一个.cs文件将我们的代码放进去
然后以刚刚图中的四个Cube 为例,我们选中GameObject 并给他添加MeshFilter组件
然后
Tool-->Mesh-->Combine点击运行我们在Asset文件夹下可以发现这个东西:
这里我们不难看出这个test是一个mesh,
然后我们给GameObject添上MeshRenderer组件并给上材质
在禁用掉GameObject下的四个Cube就可以得到我们想要的场地效果