Unity3d网格合并
几个不同的物体,在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 = ; 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 = ; 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);
}
即可合并后更洁癖一些。有兴趣的话,可以试试将这三个模型,放在一个空物体下,看看怎样修改代码才能合并明白:)
晚些时候,我会添加上合并角色骨骼模型的使用方法,即合并含有<SkinnedMeshRenderer>这个组件的,记得初次接触官网那个换装的例子研究了好久。
附上主要语句的中文手册地址:http://game.ceeger.com/Script/Mesh/Mesh.CombineMeshes.html
Unity3d网格合并的更多相关文章
- Unity网格合并_材质合并
[转]Unity网格合并_材质合并 原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网 ...
- 【转】Unity网格合并_材质合并
原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装, ...
- Unity3d场景合并
Unity3d场景合并 一.Unity3d场景合并,有一次的情况是这样的,就是我们是每个人都在开发,每个人有不同的场景,那么合并的时候,有些会出问题,那么我有一个好的方案,就是首先弄一个公共的资源库, ...
- Unity 网格合并
从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装,那么需要合并SkinnedMeshRenderer, ...
- 雷林鹏分享:jQuery EasyUI 数据网格 - 合并单元格
jQuery EasyUI 数据网格 - 合并单元格 数据网格(datagrid)经常需要合并一些单元格.本教程将向您展示如何在数据网格(datagrid)中合并单元格. 为了合并数据网格(datag ...
- unity换装系统+网格合并
这里的做法是模型把所有衣服全部穿上作为一个资源 然后还有一个只有骨骼信息的骨架资源 将这2个制作好了Prefab 模型部件数据 资源数据 [代码] using System.Collections; ...
- Unity3d mesh合并,网格合并具体用法教程
Unity开发Mesh合并网格 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
- Unity --- MeshRenderer之网格合并
创建如图所示的对象结构,parent为空对象,然后将下面的代码挂载到parent对象上运行即可. using UnityEngine; using System.Collections; public ...
- 基于geohash6编码实现相邻4、9、16网格合并
前面的两篇文章介绍了geohash的基本原理及c#代码相关实现,其中geohash 5位编码单个网格覆盖面积大约在24平方千米,6位编码单网格覆盖面大约在0.73平方千米, 相邻编码长度之间单网格覆盖 ...
随机推荐
- HTML5设计原理
HTML5是Web标准的巨大飞跃,它为什么要包含那些东西,它背后的设计原则是什么? <JavaScript DOM编程艺术>和<HTML5 For Web Designer>作 ...
- poj2584T-Shirt——网络最大流
题目:http://poj.org/problem?id=2584 以人和衣服作为点,建立超级源点和超级汇点,人连边权为1的边,衣服对源点连边权为件数的边(别弄乱顺序): 试图写构造函数,但CE了,最 ...
- rt-thread的定时器管理源码分析
1 前言 rt-thread可以采用软件定时器或硬件定时器来实现定时器管理的,所谓软件定时器是指由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务.而硬件 ...
- POJ2253(djkstra求最长最短边)
Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32257 Accepted: 10396 Descrip ...
- CAS单点登录学习(二):客户端配置
下载jar包因为cas的源码修改变动很大,所以客户端引入的jar包根据服务端的war包而定.之前搭建的cas服务端用的版本是3.5.2,经过测试,可以使用cas-client-core的3.2.1版本 ...
- 我对sobel算子的理解
转自:http://blog.csdn.net/yanmy2012/article/details/8110316 索贝尔算子(Sobeloperator)主要用作边缘检测,在技术上,它是一离散性差分 ...
- caffe template
http://www.cnblogs.com/ggjucheng/archive/2011/12/18/2292090.html
- [nyoj737]石子归并(区间dp入门题)
题意:有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值 ...
- CodeForces - 505B Mr. Kitayuta's Colorful Graph 二维并查集
Mr. Kitayuta's Colorful Graph Mr. Kitayuta has just bought an undirected graph consisting of n verti ...
- vim配置----YouCompleteMe配置
YouCompleteMe是一个功能极强的自动补全插件,安装这个插件折磨了我好久,找了很多博客查看都无果,最后还是感谢stack overflow.和其它的一些插件相比,YCM能够基于语法来给出相应的 ...