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平方千米, 相邻编码长度之间单网格覆盖 ...
随机推荐
- bzoj 1049: 数字序列 dp
题目大意: 给定一个长度为n的整数序列.在改变的数最小的和改变的幅度最小的前提下把它变成一个单调严格上升的序列.求改变的最小的数和这个幅度. 题解: (貌似以前考试考过这道题) 其实这道题就是两道题拼 ...
- 1070 Bash 游戏 V4
传送门 1070 Bash游戏 V4 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次拿的数量最少1个,最多 ...
- 详解使用python crontab设置linux定时任务
熟悉linux的朋友应该知道在linux中可以使用crontab设置定时任务.可以通过命令crontab -e编写任务.当然也可以直接写配置文件设置任务. 但是有时候希望通过脚本自动设置,比如我们应用 ...
- 原生js实现Canvas实现拖拽式绘图,支持画笔、线条、箭头、三角形和圆形等等图形绘制功能,有实例Demo
前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 演示地址:查看演示DEMO 新版本支持IE5+(你没看错,就是某软的IE浏览器)以上任意浏览器的Canvas绘图:htt ...
- mac下配置xampp的vhost
1 先确定在httpd.conf文件(/Applications/XAMPP/xamppfiles/etc/httpd.conf)中,引入了vhosts.conf文件. 1.1 在httpd.conf ...
- scala新人佑门
scala语言 1. val和var val和var当前区别在于前者只能被赋值一次,就像java中的final,但是后者则可以随意覆盖: 2. Unit Unit返回代表空返回,类似于vo 3. 类型 ...
- kindle 3 webbrowser破解,
首先下载破解: http://183.60.157.10/down_group83/M00/06/31/tzydCk3MyHYAAAAAAUTLHFYI-wk8562757/webpatch.7z?k ...
- python+ mysql存储二进制流的方式
很多时候我们为了管理方便会把依稀很小的图片存入数据库,有人可能会想这样会不会对数据库造成很大的压力,其实大家可以不用担心,因为我说过了,是存储一些很小的图片,几K的,没有问题的! 再者,在这里我们是想 ...
- Android如何解析json数组对象
import org.json.JSONArray; import org.json.JSONObject; //jsonData的数据格式:[{ "id": "27Jp ...
- java之Date(日期)、Date格式化、Calendar(日历)
参考http://how2j.cn/k/date/date-date/346.html Date(日期) Date类 注意:是java.util.Date; 而非 java.sql.Date,此类是给 ...