欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

U3D mesh合并 代码实现(一)

程序员文章站 2022-07-13 10:51:16
...

mesh合并:几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化。打个比方,传输两个1G的文件,第一个是文件就一个资源大小是1G,第二个文件有1000个子文件,每个子文件有1M。这个不用多说,肯定是第一个传输速度比较快。
合并的意义在于减少drawcall,原来的顶点可以从内存中卸掉, 合并的模型使用的是同一张贴图。

mesh合并和静态、动态合批:
我之前也很迷,在网上解释也是云里雾里,这两条比较明了

  1. 静态合批就是Mesh合并,动态合批是每一帧都进行一遍的Mesh合并。
  2. 动态合批,是由unity自己控制的,可能有时候不太符合开发者想要的效果,mesh合并比较灵活。

先来一个简单版的(不保存版本)
U3D mesh合并 代码实现(一)
一、首先随便搭个场景,新建一个空物体,把其他物体放进GameObject,添加MeshRenderer、MeshFilter组件
U3D mesh合并 代码实现(一)
U3D mesh合并 代码实现(一)
二、空物体添加脚本 代码比较简单就不解释了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyMesh : MonoBehaviour
{
   void MeshComBine()
    {
        MeshFilter[] filters = GetComponentsInChildren<MeshFilter>();
        //获取子物体MeshFilter组件
        CombineInstance[] combines = new CombineInstance[filters.Length];
      
        for (int i = 0; i < filters.Length; i++)
        {
            combines[i].mesh = filters[i].sharedMesh;
            combines[i].transform = filters[i].transform.localToWorldMatrix;
              //网格合并
        }
        Mesh finalMesh = new Mesh();
        finalMesh.CombineMeshes(combines);

        GetComponent<MeshFilter>().sharedMesh = finalMesh;
    }
    void Start()
    {
        MeshComBine();
    }

   
}

**

保存版

**
写一个工具就行了,放在Edit里,用的时候先点击要保存的物体,再生成
U3D mesh合并 代码实现(一)

using System.Collections;
using UnityEngine;
using System.Collections;
using UnityEditor;
public class EditorTools : MonoBehaviour
{
	[MenuItem("Tools/Save Combine Mesh")]
	public static void SaveMesh()
	{
		Mesh m = Selection.activeGameObject.GetComponent<MeshFilter>().sharedMesh;
		AssetDatabase.CreateAsset(m, "Assets/art/Mesh.asset");
		AssetDatabase.SaveAssets();
	}
}

后面说一下MeshBaker插件的使用

补充:

  • Mesh就是指模型的网格(同名组件是用于调整网格属性的)
  • MeshFilter一般是用于获得模型网格的组件
  • 而MeshRender是用于把网格渲染出来的组件

CombineMeshes三个参数:

  • combine:CombineInstance(struct)类型的数组,这个结构里包括了需要合并的网格(mesh),子网格的索引(subMeshIndex)和转换矩阵(transform)

  • mergeSubMeshes:bool值,是否需要将所有的Mesh合并成一个。

  • useMatrices:bool值,是否使用矩阵,如果为false,那么CombineInstance里的transform将会被忽略。

相关标签: unity