U3D mesh合并 代码实现(一)
程序员文章站
2022-07-13 10:51:16
...
mesh合并:几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化。打个比方,传输两个1G的文件,第一个是文件就一个资源大小是1G,第二个文件有1000个子文件,每个子文件有1M。这个不用多说,肯定是第一个传输速度比较快。
合并的意义在于减少drawcall,原来的顶点可以从内存中卸掉, 合并的模型使用的是同一张贴图。
mesh合并和静态、动态合批:
我之前也很迷,在网上解释也是云里雾里,这两条比较明了
- 静态合批就是Mesh合并,动态合批是每一帧都进行一遍的Mesh合并。
- 动态合批,是由unity自己控制的,可能有时候不太符合开发者想要的效果,mesh合并比较灵活。
先来一个简单版的(不保存版本)
一、首先随便搭个场景,新建一个空物体,把其他物体放进GameObject,添加MeshRenderer、MeshFilter组件
二、空物体添加脚本 代码比较简单就不解释了
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里,用的时候先点击要保存的物体,再生成
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将会被忽略。