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 ...
随机推荐
- latex之矩阵表示
$ \begin{matrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{matrix}\quad \begin{ ...
- 2018.4.24 快排查找第K大
import java.util.Arrays; /* 核心思想:利用快排思想,先假定从大到小排序,找枢纽,枢纽会把大小分开它的两边,当枢纽下标等于k时, 即分了k位在它左边或右边,也就是最大或最小的 ...
- 手撕RPC框架
手撕RPC 使用Netty+Zookeeper+Spring实现简易的RPC框架.阅读本文需要有一些Netty使用基础. 服务信息在网络传输,需要讲服务类进行序列化,服务端使用Spring作为容器.服 ...
- python写service时全局变量问题
在尝试用flask写service的过程中,我发现全局变量使用虽然很方便,但其实是很冒险的. 本次我使用的是声明global变量的方式,如果作为本地的单次使用的程序来说,确实没有问题并且很好用,对于竞 ...
- 重建二叉树(JAVA)
重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历 ...
- Vue创建头部组件示例
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...
- 【java】模板方法设计模式
模板方法:在定义功能时,功能一部分是确认的,另一部分是不确认的或者后续会变化的.这时可以把不确定的部分暴露出去,定义成抽象类或者接口,由子类来完成. abstract class GetDuring ...
- oracle中如何修改用户名和密码
1.以Windows操作系统为例,打开命令提示符,输入命令sqlplus /nolog ,进入oracle控制台,并输入 conn /as sysdba;以DBA角色进入. 2.连接成功后,输入“se ...
- 2013-7-30 802.1X企业级加密
今天做了U9510的企业级加密标杆测试,写了企业级加密标杆设备的操作指南.最后做到server 2003却出了问题,peap能关联,但是TLS怎么都关联不上.用adb shell查看logcat日志, ...
- Linux(CentOS-7) 下载 解压 安装 redis 操作的一些基本命令
使用xshell 连接到虚拟机,并且创建 一个redis目录:创建文件命令:mkdir 文件名ls:查看当前文件里面的所有文件 使用xftp 将下载的linux版本 reids上传动新建的redis目 ...