Unity 网格合并

从优化角度,Mesh需要合并。

从换装的角度(这里指的是换形状、换组成部件的换装,而不是挂点型的换装),都需要网格合并、材质合并。如果是人物的换装,那么需要合并SkinnedMeshRenderer,并重刷对应的骨骼列表。网格合并后对模型的渲染可以降低GPU的负担,但是经过测试发现,虽然网格合并了但是由于子物体网格的材质是不同的并没有降低DrawCall,如果把材质改成相同的,Unity自身会进行批处理合并,所以DrawCall就会减少!在MMO的游戏中,网格动态合并还是非常有必要的!

网格合并代码:

   private void CombineMesh()
    {
        //获取自身和所有子物体中所有的 MeshRenderer 组件
        MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();

        //材质球数组
        Material[] materials = new Material[meshRenderers.Length];

        for (int i = 0; i < meshRenderers.Length; i++)
        {
            materials[i] = meshRenderers[i].sharedMaterial;
        }

        // 合并 Mesh
        // 后去自身和子物体中所有 MsehFilter 组件
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();

        CombineInstance[] combines = new CombineInstance[meshRenderers.Length];

        for (int i = 0; i < meshFilters.Length; i++)
        {
            combines[i].mesh = meshFilters[i].sharedMesh;
            // 矩阵(Matrix)自身空间坐标的点转换成世界空间坐标的点
            combines[i].transform = meshFilters[i].transform.localToWorldMatrix;
            meshFilters[i].gameObject.SetActive(false);
        }

        //重新生成mesh
        MeshFilter meshFilter = transform.GetComponent<MeshFilter>();
        if (meshFilter == null)
        {
            meshFilter = gameObject.AddComponent<MeshFilter>();
        }

        // 给 MeshFilter 组件的 mesh 赋值
        meshFilter.mesh = new Mesh();
        //合并Mesh, 第二个参数 false,表示并不合并为一个网格,而是一个自网格列表
        transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combines, false);
        transform.gameObject.SetActive(true);

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

        MeshRenderer meshRender = transform.GetComponent<MeshRenderer>();
        if (meshRender == null)
        {
            meshRender = gameObject.AddComponent<MeshRenderer>();
        }
        meshRender.sharedMaterials = materials;
    }

运行前:

合并之后:

发现合并之后,三个子物体的材质都在父物体上,材质合并到了一个MeshRender下。

工程地址:[email protected]:wuzhang/UnityCombineMeshRender.git

时间: 2024-10-10 09:25:58

Unity 网格合并的相关文章

Unity 网格合并MeshBaker(一)

使用MeshBaker合并相同材质网格,并导出新网格. 1:新建MeshBaker对象. 2:打开操作面板. 3:选中你要合并的网格对象. 4:添加到列表中,如果添加成功会,显示出所有的可合并对象. 5:指定生成新的Material的保存路径.(如果不需要,可忽略) 6:开始生成新的Material 7:生成新的网格,可指定新生成的合并对象的父节点(注意父节点的Scale必须等于1,否则会错位),可指定将合并后的网格保存到指定的新Mesh上(注意,如果不保存第二个合并会冲丢第一次的合并). 8:

Unity网格合并_材质合并

https://blog.csdn.net/dardgen2015/article/details/51517860 很多时候我们需要把具有相同shader的材质球合并,从而减少drawcall的产生. 比如九龙战里面,一个人物带有10个部位,10个部位各自来自不同的fbx文件,加上身体,就有11个材质球,占上11个drawcall.如果主城里面跑着10个角色,光人物就占了110个drawcall!所以这种时候材质球合并是必须的. (下图为九龙战里面的多部位换装效果) 材质球合并,分以下几步走,

Unity3d网格合并2

几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化. 在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上. CombineMeshes.cs内容如下: using UnityEngine; using System.Collections; public class CombineMeshes : MonoBehaviour { void Start() { MeshFilter[] meshFilters = GetCom

Unity3d网格合并

几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化. 在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上. CombineMeshes.cs内容如下: using UnityEngine; using System.Collections; public class CombineMeshes : MonoBehaviour { void Start() { MeshFilter[] meshFilters = GetCom

Unity MeshBaker 合并网格和材质

MeshBaker 能够合并网格和材质,达到减少 Draw Calls 的目的. 官网地址:http://www.digitalopus.ca/site/mesh-baker/ Asset Store地址:https://www.assetstore.unity3d.com/en/#!/content/5017 在这里简单测试使用下,环境如下: Unity 4.5.4 MeshBaker 3.3 1. 打开示例场景"Assets\MeshBaker\Examples\SceneBasic.uni

基于geohash6编码实现相邻4、9、16网格合并

前面的两篇文章介绍了geohash的基本原理及c#代码相关实现,其中geohash 5位编码单个网格覆盖面积大约在24平方千米,6位编码单网格覆盖面大约在0.73平方千米, 相邻编码长度之间单网格覆盖面积跨度太大,在实际应用中希望计算出3平方千米.5平方千米.10平方千米的覆盖率,可行的方案在Geohash6对应的网格上进行4.9.16网格的合并.    基本思路 : 将城市坐标看成一个基于经纬度线的坐标系,取出所在城市的经纬度范围(为了减少网格的个数,在满足业务的需求的前提下,确定的范围值越小

Unity API - C

废话不多说,一针见血,go! 一起来看 API Caching 缓存 Camera 摄像机 CapsuleCollider 胶囊碰撞器 CharacterController 角色控制器 CharacterJoint 角色关节 Cloth 布料 ClothRenderer 布料渲染器 ClothSkinningCoefficient 布料蒙皮系数 Collider 碰撞器 Collision 碰撞 Color 颜色 CombineInstance 合并实例 Caching 缓存 Caching.

Unity 的一些优化总结 (难度3 推荐4)

原文地址: http://www.jianshu.com/p/3acee1101fe4 从别的地方看到一些资源使用方面的文章,从中抽取一些细节在这里总结一下: Draw Call数量.Triangle数量 和 可见蒙皮网格数量 一般来说,Draw Call 数量.Triangle 数量 和 可见蒙皮网格数量 的推荐值需根据平台的不同而不同.对于 Mobile 低端移动设备来说,建议 Draw Call 数量的主要范围在 [0,200] 区间内,Triangle 数量保持在 10万 以下,可见蒙皮

Unity 学习笔记01

简单的先说说Unity中的比较常用的英语单词,不需要背诵,至少看到能大概想起中文意思即可. 常用英语 . Scripts---存放脚本的目录 scene---存放场景的目录 Horizontal---水平 Vertical---垂直  position---位置 Rotation---旋转Destroy---销毁 Collision---碰撞  Collider---触发  virtual---子类可修改 Load Selection  载入选择    Save Selection  存储选择