今天介绍一个优化技巧,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就可以得到我们想要的场地效果

posted on 2020-07-28 23:10  百晓灵狐  阅读(1285)  评论(0编辑  收藏  举报