unity中的合并网格CombineMesh

介绍到CombineMesh之前,需要先了解一下mesh和sharedMesh

mesh:mesh改变的话,会新建一个mesh出来,再进行赋值,原mesh不会被改变,这使得内存增加。

SharedMesh:sharedMesh改变的话,原的mesh也会被改变,但不会使得内存增加

SharedMesh是公用的,是引用传递,而mesh是值传递,是各自拥有的实例,sharedMesh改变,则所有的使用到此mesh的都会改变,mesh消耗更多的内存,各有各的优点

  CombineMeshes合并网格:

  unity的场景视图中,选取一个物体作为父对象,将其他两个对象作为它的的子对象

  并且新建一个脚本,添加到父对象上,脚本如下:

  ...

  public class CombineMesh:Monobehaviour

  {

    void Start()

    {

      MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); //  获取自身和所有子物体的所有meshFilter

      MeshRenderer[] meshRenderer = GetComponentsInChildren<MeshRenderer>();获取自身何所有子物体的所有meshRenderer

      CombineInstance[] combine = new CombineInstance[meshFilters.Length];创建并合并实例

      Material[] mats = new Material[meshRenderer.Length];新建材质球数组

      for(int I =0 ; I < meshFilters.Length; I++)

      {

        mats[i] = meshRenderer[i].sharedMaterial;

        combine[i].mesh = meshFilters[i].sharedMesh;

        combine[i].transform = meshFilters[i].transform.localToWorldMatrix;

        meshFilters[i].gameObject.SetActive(false);

      }

      transform.GetComponent<MeshFilter>().mesh = new Mesh(); //新建一个mesh赋值给它

      transform.GetComponent<MeshFilter>().mesh.CombineMeshes(Combine,false);//为mesh.CombineMeshes添加一个false参数,表示并不是合并为一个网格,而是一个子网格列表

      transform.GetComponent<MeshRenderer>().sharedMaterials = mats; //为合并后的GameObject指定材质

      transform.gameObject.SetActive(true);

    }

  }

 

运行后,你会发现,场景视图层级下,子物体已经被隐藏了,父物体显示的时候,会连带将子物体的mesh一起显示出来,这是三个物体已经被合并成了一个物体了,因为网格被合并了

posted @ 2022-05-17 11:59  专杀小三  阅读(1967)  评论(0编辑  收藏  举报