Unity网格合并_材质合并
【转】Unity网格合并_材质合并
原帖请戳:Unity网格合并_材质合并
写在前面:
从优化角度,Mesh需要合并。
从换装的角度(这里指的是换形状、换组成部件的换装,而不是挂点型的换装),都需要网格合并、材质合并。如果是人物的换装,那么需要合并SkinnedMeshRenderer,并重刷对应的骨骼列表。
示例:
1,新建两个Cube,和一个Cylinder。分别作为坦克的底盘(Cube_chassis)、炮塔(Cube_turret)、炮管(Cylinder_gun)。如下图所示。
2,为了测试换装,我们加入三个材质球,调整一下颜色,然后分别赋给底盘(Cube_chassis)、炮塔(Cube_turret)、炮管(Cylinder_gun)。
3,把炮塔(Cube_turret)和炮管(Cylinder_gun),变成底盘(Cube_chassis)的子物体。也就是说,新的模型,是以底盘为基础的。
4,用CombineMeshes方法,合并mesh。并且用代码把【材质】也一起“合并”了。把下面的Combine_Test.cs文件,拖拽到底盘(Cube_chassis)上,之后运行。
using UnityEngine;
using System.Collections; public class Combine_Test : MonoBehaviour { // Use this for initialization
void Start ()
{
//---------------- 先获取材质 -------------------------
//获取自身和所有子物体中所有MeshRenderer组件
MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();
//新建材质球数组
Material[] mats = new Material[meshRenderers.Length];
for (int i = ; i < meshRenderers.Length; i++) {
//生成材质球数组
mats[i] = meshRenderers[i].sharedMaterial;
}
//---------------- 合并 Mesh -------------------------
//获取自身和所有子物体中所有MeshFilter组件
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
for (int i = ; i < meshFilters.Length; i++) {
combine[i].mesh = meshFilters[i].sharedMesh;
//矩阵(Matrix)自身空间坐标的点转换成世界空间坐标的点
combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
meshFilters[i].gameObject.SetActive(false);
}
//为新的整体新建一个mesh
transform.GetComponent<MeshFilter>().mesh = new Mesh();
//合并Mesh. 第二个false参数, 表示并不合并为一个网格, 而是一个子网格列表
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);
transform.gameObject.SetActive(true); //为合并后的新Mesh指定材质 ------------------------------
transform.GetComponent<MeshRenderer>().sharedMaterials = mats;
} // Update is called once per frame
void Update () { }
}
5,运行效果如下。可以看到,Mesh和材质,都很好的得到了合并。坦克已经由零件,变成一个整体了!
但是,大家会发现这个模型,产生了一些变形!难道是这样不对,或者是bug么?不,其实不用担心。这是因为前面用的Cube、Cylinder 等模拟底盘炮塔,手动调节了他们的缩放比例放造成的。如果以某个组件为根物体,那么它的缩放比例,直接影响合并后生成的新物体。各个部件的缩放比都会按它走!。
也就是说,如果你想合并后不变形,就不要更改根物体的缩放比例。
参考:
关键函数,就是下面这个合并网格的函数了:
CombineMeshes(CombineInstance[]combine, boolmergeSubMeshes = true, booluseMatrices = true);
Unity官网,关于网格合并的例子:
http://docs.unity3d.com/ScriptReference/Mesh.CombineMeshes.html
程序员俱乐部-Unity3d网格合并:
http://www.cxyclub.cn/n/54078/
Unity网格合并_材质合并的更多相关文章
- 【转】Unity网格合并_材质合并
原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装, ...
- Unity网格合并_材质合并[转]
http://blog.csdn.net/chenggong2dm/article/details/41699029
- table_横向合并_纵向合并
colspan是横向合并; rowspan是纵向合并; <caption></caption>表格标题(自动居中)
- Unity 网格合并
从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装,那么需要合并SkinnedMeshRenderer, ...
- C# 创建邮件合并模板并合并文本、图片
对于Word中的邮件合并功能,用户可以将邮件合并后的结果文档保存并打印,也可以通过邮件的形式发送,在很多场合需要使用到此功能.那对于编程人员,我们也可以在C#语言环境中通过代码的形式来实现.根据需要先 ...
- 启发式合并 splay合并 线段树合并基础
Gold is everywhen! - somebody 启发式合并 将小的集合一个个插入到大的集合. 每次新集合大小至少比小集合大一倍,因此每个元素最多合并\(\log n\)次,总复杂度为\(n ...
- jquery数组的合并 对象的合并
直接转自:https://www.cnblogs.com/ooo0/p/7737678.html 1.数组的合并 1.1 concat方法 var a=[1,2,3],b=[4,5,6]; var c ...
- Java 在Word中创建邮件合并模板并合并文本和图片
Word里面的邮件合并功能是一种可以快速批量操作同类型数据的方式,常见的如数据填充.打印等.其中必不可少的步骤包括用于填充的模板文档.填充的数据源以及实现邮件合并的功能.下面,通过Java程序展示如何 ...
- Unity性能优化之特效合并
特效合并,意思是说将粒子所用的零碎图片,以shader为单位合并成一张图集,好处就是可以降低draw call.试想,合并前每个粒子使用一个material,而每一个material就要占用一个dra ...
随机推荐
- GoogLeNet 之 Inception-v1 解读
本篇博客的目的是展示 GoogLeNet 的 Inception-v1 中的结构,顺便温习里面涉及的思想. Going Deeper with Convolutions:http://arxiv.or ...
- mysql locking
1. 意向锁 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-insert-intention-locks 官方文 ...
- jQuery ajax瀑布流加载静态的列表页面
1.加载一行数据 <script> //滚动加载事件 var Loadurl = "{$url}"; if(window.location.href !== Loadu ...
- C++中多维数组传递参数
在c++自定义函数时我们有时需要传递参数,有时以多维数组作为参数,这里就遇到了多维数组该怎么传值的问题了,首先我们看看一维数组是怎么做的. void print_num(int num[], int ...
- 认识:人工智能AI 机器学习 ML 深度学习DL
人工智能 人工智能(Artificial Intelligence),英文缩写为AI.它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学. 人工智能是对人的意识. ...
- python------面向对象进阶 Socket网络编程
一.Socket网络编程 1.七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系 ...
- EF LIKE 查询
<!-- CSDL content --> <edmx:ConceptualModels> <Schema Namespace="Model" Ali ...
- No input file specified.
no input file specified 解决方法 2018年02月23日 14:25:07 tiramisuer8023 阅读数:36607 版权声明:本文为博主原创文章,未经博主允许不得 ...
- Lepus监控之Oracle配置
1.安装cx_Oracle a.官网下载客户端组件包 oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpmoracle-instantclien ...
- Hive环境的安装
hive是什么:hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能(HQL) hive有什么用 1.通过类SQL语句快速实现简单的Map ...