U3D mesh合并 代码实现(一)

本文详细介绍了Unity3D中Mesh合并与合批技术,包括静态合批(Mesh合并)和动态合批的概念及其意义。通过实例演示如何在场景中实现Mesh合并,减少DrawCall,优化游戏性能,并探讨了MeshBaker插件的使用。

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

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

  1. 静态合批就是Mesh合并,动态合批是每一帧都进行一遍的Mesh合并。
  2. 动态合批,是由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将会被忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值