Unity的Mesh合并

Unity合并mesh,【CombineMeshes】将多个物体合并成一个物体或层级关系的物体 Unity3D将多个物体合并一个物体或层级关系的物体 一、三种合并工具 1.MergeMesh1: (效率低,适应性高)模型点超过65535自动分模型,一个mesh上有多个材质会自动分出来成为子集部分,父节点要有mesh则 fatherMesh = true; 2.MergeMesh2: (效率快、适应性低)模型点不能超过65535,超过会报错,且相同材质才会合并,若一个mesh上有多个材质会少一些材质(也就是丢失了一部分模型) 3.MergeMesh3: (适应性极低)模型点不能超过65535,超过会 阅读详情

Unity3d网格合并

转载:http://www.cxyclub.cn/n/54078/

 

  • 摘要:几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化。在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上。CombineMeshes.cs内容如下:usingUnityEngine;usingSystem.Collections;publicclassCombineMeshes:MonoBehaviour{voidStart(){MeshFilter[]meshFilters=GetComponentsInChildren<
  • 标签:
  •  

几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化。

在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上。

CombineMeshes.cs内容如下:

using UnityEngine;
using System.Collections;

public class CombineMeshes : MonoBehaviour
{
    void Start()
    {
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();       //获取自身和所有子物体中所有MeshFilter组件
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];    //新建CombineInstance数组

        for (int i = 0; i < meshFilters.Length; i++)                            
        {
            combine[i].mesh = meshFilters[i].sharedMesh;
            combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            meshFilters[i].gameObject.SetActive(false);
        }

        transform.GetComponent<MeshFilter>().mesh = new Mesh();
        transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);       //合并
        transform.gameObject.SetActive(true);
    }
}

 

保存后执行,结果如图:

观察原本的两个子物体已经变为隐藏状态,观察Cube的网格,已经变为如图中3个物体合并后的网格:

 

接着想一想,如果3个物体分别赋了不同的材质球,合并后会是什么样呢?

那么,接下来,试试我们的想法。修改场景,为3个物体赋上不同的材质球,如下图:

如果还是用这段代码,将会是如下结果:

很明显,网格虽然是合并了,但是我们在合并的过程中,并没有代码是处理材质球的,因此,合并后的网格统一赋上了Cube的材质球。

那么,如果我们既要合并网格,又要保持3个部分保持原来各自的材质球,能否实现呢?答案是肯定的。

将"CombineMeshes.cs"中的代码进行如下修改:

using UnityEngine;
using System.Collections;

public class CombineMeshes : MonoBehaviour
{
    void Start()
    {
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();       
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];    

        MeshRenderer[] meshRenderer = GetComponentsInChildren<MeshRenderer>();  //获取自身和所有子物体中所有MeshRenderer组件
        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();
        transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);//为mesh.CombineMeshes添加一个 false 参数,表示并不是合并为一个网格,而是一个子网格列表

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

        transform.gameObject.SetActive(true);
    }
}

再一次运行后,如图:

达到目的。

还可以进而在脚本中做相应修改,以满足更复杂一些的需求。主要在于,理解了网格合并的原理,即可灵活运用。比如,在循环中,将

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

替换为

if (meshFilters[i].gameObject.name != gameObject.name)
{
    Destroy(meshFilters[i].gameObject);
}

即可合并后更洁癖一些。有兴趣的话,可以试试将这三个模型,放在一个空物体下,看看怎样修改代码才能合并明白

Unity合并Mesh实战:三种CombineMeshes方法性能对比与应用场景解析 本文深入解析Unity中合并Mesh的三种方法(MergeMesh1、MergeMesh2、MergeMesh3)的性能对比与应用场景。通过实际案例和性能测试,帮助开发者根据项目需求选择合适的合并策略,有效减少Draw Call、优化内存使用并提升渲染效率。特别适合处理大型3D场景中的物体合并问题。 阅读详情

相关推荐

Unity中mesh的合并

最近做的项目,美术给的资源很散,好多mesh需要用同一个mesh collider,所以需要自己合并mesh,然后加一个mesh collider 做了一个插件,在Hierachy中选中物体,那么它以及它的子物体的mesh,会合并成为一个mesh,并且保存到Project中,可以多选,选择几个物体就会生成几个合并的mesh   [MenuItem("Plugins/合并选择mesh...

csdn_yxt的博客 4496

Unity优化(1)——合并Mesh的两种方法

Unity性能优化——合并Mesh的两种方法

leikang111的博客 2545

Unity Mesh合并

Unity Mesh合并

qq_20589257的博客 437

Unity-Mesh网格合并

合并多个小的网格为一个大网格可以减少Draw Call的数量,从而提高渲染性能。每个Draw Call都需要CPU和GPU之间的通信,合并网格可以显著降低这种开销。:合并网格可以减少内存中的对象数量,尤其是在场景中有大量相似对象时,这样可以节省内存资源。:合并后的网格可以简化碰撞体的管理,减少需要计算的碰撞体数量,从而提高物理计算的效率。:通过合并网格,可以利用GPU的批处理能力,提升渲染效率,尤其是在使用静态物体时。:合并网格可以使场景中的对象管理更加简单,减少场景中的对象数量,便于管理和优化。

gyx201266的博客 1316

【Unity 优化】Skinned-Mesh 能动态合并嘛?

————–2017.9.16I'v tryed to combine the skinned meshes today.I can combine all the skinned meshes to one now.And they looks like at the right position and with the right uvs. However , It's just a stati

Andrew的游戏世界 4132

unity 多个mesh合并——Mesh Baker

第一步:上网找到MeshBaker的安装包进行安装,打开unity并点击当前这个软件进行导入。第二步:创建自己的测试场景MeshBaker自带很多材质球​​​​​​第三步:使用meshBaker1.创建对象,GameObject-&gt;CreateOther-&gt;MeshBaker-&gt;Mesh And MaterialBaker​​在Hierarchy会出现MaterialBaker0...

enjoy 1万+

Unity优化篇——mesh合并

一、mesh合并大厅分为: 1.合并网格 2.合并贴图 3.附加材质 4.重新计算UV 这里提一下附加材质,附加材质是对合并后的mesh重新赋予了一个material。废话不多说上代码! 备注:代码大多是整合的网上的资源,而且代码未优化! using System.Collections; using System.Collections.Generic; using Unit...

zyxyuting的博客 3263

在unity中结合FBX Exporter合并mesh并导出Fbx

目标是把多个mesh合并成一个或者几个,降低drawcall,但是又不想标记成static的,也不像进3dmax合并的一个尝试。

weixin_38926960的博客 4965

Unity Mesh网格合并

Mesh网格合并通常是优化中常用的小手段,目的是为了减少drawcall,大量的drawcall会造成CPU的性能瓶颈。例如下图中船只里的钢材货物,由诸多钢材模型堆砌而成。 我们将其放在一个空场景里查看Stats信息,可见Batches指数为94 下面我们进行网格合并,将所有的钢材合并为一个Mesh,代码如下: if (GUILayout.Button("Combine")) { List<Material> materials = new Lis...

当代野生程序猿 9527

Simple Mesh Combine 1.61

Simple Mesh Combine 1.61.unitypackage 简单合并网格,场景优化必备

Unity 网格合并Mesh Combine 1.61

Simple Mesh Combine是一键式网格组合工具,通过将此脚本附加到包含具有相同材质的网格的GameObject来轻松组合网格,单击组合按钮合并网格

Unity——Mesh合并,以及SkinMeshRenderer合并

Unity——Mesh合并,当遇到多个SkinMeshRenderer 合并时的一个坑 先讲个Mesh合并的例子 1.先建立两个物体,把一个物体挂到另外个物体下面 在Cube1 上挂上一下脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { void Start () { Matrix4x4 mat

weixin_43945471的博客 4110

如何让Arduino IDE支持你手里的STM32 nucleo开发板

Arduino IDE开发环境在默认情况下不支持STM32 NUCLEO开发板,只有通过添加附加开发板管理包才能使用。目前为止,只有一部分板子支持使用Arduino IDE开发环境进行开发,分别是 Nucleo F207ZG, Nucleo F429ZI, Nucleo F030R8, Nucleo F091RC, Nucleo F103RB, Nucleo F303RE, Nucl...

mzw72188552的专栏 8972

unity mesh合并

默认情况下,应用同一个材质的物体,面数小于300,会自动合并mesh 注意,如果材质被实例化,则不能自动合并 如下: Material m_mat; var render = gameObject.GetComponentInChildren(); if(null == render) render =  gameObject.GetComponentInChildren(); m_

linxinfa的专栏 2195

VCSA的vmware-updatemgr服务无法启动和vSAN界面报“certificate chain is not trusted and thumbprint doesn‘t match”处理

"Unable to update CM service info"和"Server certificate chain is not trusted and thumbprint doesn't match"问题处理

jetliu05的博客 1883

MATPOWER下载安装教程

将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2016b\bin目录下。原来的窗口中多了很多文件路径,点击【保存】,再点击【关闭】选择所要添加的MATPOWER文件夹,点击【选择文件夹】二、将MATPOWER放在bin目录下。找到菜单栏的【设置路径】点击【添加并包含子文件】一、从官网下载后解压。

weixin_47365903的博客 2万+

Unity3D研究院之利用unity自带API提前合并场景Mesh

Unity自带了合并Mesh的功能,最简单的做法就是在Root节点勾选static选项,它的原理就是运行时合并。但是最近我在开发的时候就遇到了问题,因为我们场景非常庞大,Mesh的顶点不能超65535所以Unity会自动把合并的mesh分成了很多分mesh,总之顶点都小于65535。 在IOS上测试都是正常的,可是在有些Android机器是场景就出问题了。就是渲染不正确,所以得到的结论就是不能完...

真像大白阿的博客 533

Ubuntu系统下主板GPU温控pwm风扇

在Linux系统下——以Ubuntu为例,配置主板sys_fan等接口连接pwm温控风扇转速根据NVIDIA GPU温度,为服务器GPU等无主动散热显卡提供散热。

罗思哲的博客 5034

一种Unity中将Mesh合并的方法

void Start()     {         //获取MeshRender;         MeshRenderer[] meshRenders = GetComponentsInChildren();           //材质;         Material[] mats = new Material[meshRender

BIGWhiteT_t的博客 1311

大模型-高通平台性能测试示例-2

在QNN中,可以使用(genis-t2t-run)和这两个工具来进行推理的性能分析。支持在QNX操作系统或Android操作系统上进行性能分析。:提供基本的性能数据,如运行时间、资源消耗等。:提供更详细的性能数据,可能包括各个操作的执行时间、资源使用情况等。:是指在性能分析的同时进行代码质量检查,以发现潜在的问题。:是指跟踪和分析神经网络中各个操作的性能,以优化网络结构或参数。

点滴的岁月 1493

【Diffusion分割】医学图像分割中去噪扩散技术

扩散模型(DPM)在图像生成方面表现出了卓越的性能,其性能往往优于其他生成模型。自其问世以来,强大的噪声-图像去噪管道已被扩展到各种判别任务中,包括图像分割。在医学成像中,图像往往是大型三维扫描图像,由于内存消耗大、迭代采样过程耗时,使用 DPM 对一幅图像进行分割的效率极低。在这项工作中,我们提出了一种(LDSeg),可在潜空间中执行扩散,用于医学影像分割。我们。潜空间条件扩散不仅能确保对多标签对象进行精确的 n-D 图像分割,还能缓解基于 DPM 的传统分割法的主要潜在问题:(。

qq_43583311的博客 1171

Unity mesh 合并

Unity mesh 合并 簡介: 基本上就是把 很多物體結合成一個物體 的作法,這種做法有很多優點,例如:1. 提高效能2. 統一材質 (只要建立一個材質,就能控制、分配給所有物體)3. 動畫控制方便 (像是你要在 Unity 做人物換衣服、換物件 卻還要有 人物走路動畫 + 人物攻擊動畫 ...等等 ,  ...

N的专栏 243

告别调参烦恼:用Simulink手把手实现自适应模糊PID温度控制(附模型下载)

本文详细介绍了如何使用Simulink实现自适应模糊PID温度控制,解决传统PID调参难题。通过模糊推理引擎动态调整PID参数,系统能自动适应不同工况,显著提升控制精度和响应速度。文章包含完整的建模步骤、参数优化技巧和工业应用扩展,并附赠可下载模型,帮助工程师快速掌握这一智能控制技术。

weixin_30872499的博客 153

Unity场景Mesh网格合并

Unity场景Mesh网格合并 今天突然被美术问傻了,就是在游戏场景中Mesh找不到了源文件,就是这个 查了一下,原来是之前项目在做场景的时候把一些mesh合并了。到底怎么实现的呢? 为什么要合并Mesh unity引擎中渲染代价的指标是场景中网格(Mesh)的数量,对显卡来说渲染一个100面的物体和渲染一个1500面的物体几乎是等价的,于是当多个物体的材质(Shader)相同时,可以把他们的网格...

weixin_42422809的博客 1937

高频面波成像实战:从频散曲线到全波形反演

面波勘探是近地表工程勘察的重要手段,其核心原理在于不同频率的面波对地下介质的敏感深度不同,由此形成的频散曲线能够反映浅层剪切波速结构。相较于传统钻探与折射波法,高频面波成像具有无损、高效、对低速夹层敏感等优势,广泛应用于路基检测、空洞探测、滑坡调查等领域。在实际工程中,从野外采集的排列设计、震源选型,到频散谱提取与频散曲线反演,每一步都直接影响成像精度。然而频散反演受限于一维层状假设,难以刻画横向剧烈变化的地质体。全波形反演通过拟合完整波形信息,能够突破频散曲线的分辨率边界,获得更精细的近地表速度模型。本文

weixin_29090917的博客 270

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Unity中Mesh重叠顶点合并参考及其应用

Unity中Mesh重叠顶点合并参考及其应用

ttod的博客 870

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 5分钟使用Unity制作AR应用,结合EasyAR制作AR(转)
下一篇: 学习并整理Unity的几种优化方法
One_Piece_Fu
博客等级 码龄9年 16粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值