创建如图所示的对象结构,parent为空对象,然后将下面的代码挂载到parent对象上运行即可。

 using UnityEngine;
using System.Collections; public class CombineMeshAndMaterials : MonoBehaviour
{
void Start()
{
CombineMesh();
}
void CombineMesh()
{
//收集要合并的贴图
MeshRenderer[] oldMRArray = GetComponentsInChildren<MeshRenderer>();
Material[] oldMArray = new Material[oldMRArray.Length];
Texture2D[] textures = new Texture2D[oldMRArray.Length];
for (int i = , iMax = oldMRArray.Length; i < iMax; ++i)
{
oldMArray[i] = oldMRArray[i].sharedMaterial;
Texture2D t2d = oldMArray[i].GetTexture("_MainTex") as Texture2D;
Texture2D _t2d = new Texture2D(t2d.width, t2d.height, TextureFormat.ARGB32, false);
_t2d.SetPixels(t2d.GetPixels(, , t2d.width, t2d.height));
_t2d.Apply();
textures[i] = _t2d;
} //创建合并后的材质
MeshRenderer newMR = gameObject.AddComponent<MeshRenderer>();
Material newM = new Material(oldMArray[].shader);
newM.CopyPropertiesFromMaterial(oldMArray[]);
newMR.sharedMaterial = newM; //创建合并后的贴图,
Texture2D newTex = new Texture2D(, );
newM.SetTexture("_MainTex", newTex); //将合并后的贴图赋给合并后的材质 //重新计算贴图UV
MeshFilter[] oldMF = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combines = new CombineInstance[oldMF.Length];
Rect[] rects = newTex.PackTextures(textures, , ); //贴图打包 ,矩形的数组包含每个输入的纹理的UV坐标
for (int i = , iMax = oldMF.Length; i < iMax; ++i)
{
Rect rect = rects[i];
Mesh mesh = oldMF[i].mesh;
Vector2[] newUVs = new Vector2[mesh.uv.Length]; //刷新uv
for (int j = , jMax = mesh.uv.Length; j < jMax; ++j)
{
//如果这里看不太懂,说明对uv的确切含义不太明白
//uv是一个比值,u = 横向第u个像素/原始贴图的宽度 v = 竖向第v个像素/原始贴图的高度
//rect.x : 原贴图在合并后的贴图的 x 坐标, rect.y : 原贴图在合并后的贴图的 y 坐标
newUVs[j].x = mesh.uv[j].x * rect.width + rect.x;
newUVs[j].y = mesh.uv[j].y * rect.height + rect.y;
}
mesh.uv = newUVs;
combines[i].mesh = mesh;
combines[i].transform = oldMF[i].transform.localToWorldMatrix; //没有这句,合并后的网格无法看到
oldMF[i].gameObject.SetActive(false);
} //创建合并后的网格
MeshFilter newMF = gameObject.AddComponent<MeshFilter>();
Mesh newMesh = new Mesh();
newMesh.CombineMeshes(combines, true, true);
newMF.mesh = newMesh;
}
}

Unity --- MeshRenderer之网格合并的更多相关文章

  1. Unity 网格合并

    从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装,那么需要合并SkinnedMeshRenderer, ...

  2. Unity网格合并_材质合并

    [转]Unity网格合并_材质合并 原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网 ...

  3. 【转】Unity网格合并_材质合并

    原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装, ...

  4. unity换装系统+网格合并

    这里的做法是模型把所有衣服全部穿上作为一个资源 然后还有一个只有骨骼信息的骨架资源 将这2个制作好了Prefab 模型部件数据 资源数据 [代码] using System.Collections; ...

  5. Unity3d网格合并

    几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化. 在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上. Combi ...

  6. 雷林鹏分享:jQuery EasyUI 数据网格 - 合并单元格

    jQuery EasyUI 数据网格 - 合并单元格 数据网格(datagrid)经常需要合并一些单元格.本教程将向您展示如何在数据网格(datagrid)中合并单元格. 为了合并数据网格(datag ...

  7. Unity中的网格与材质球合并

    http://blog.csdn.net/dardgen2015/article/details/51517860

  8. Unity网格合并_材质合并[转]

    http://blog.csdn.net/chenggong2dm/article/details/41699029

  9. Unity3d mesh合并,网格合并具体用法教程

    Unity开发Mesh合并网格 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

随机推荐

  1. Linux 安装 RabbitMQ 3.7.8 安装部署

    Linux 安装 rabbitmq 3.7.8 安装部署 安装 ncurses 1.安装GCC GCC-C++ Openssl等模块 yum -y install make gcc gcc-c++ k ...

  2. centos6下jbd2进程占用大量IO处理

    刚在尝试重现一个bug时,好像在killed mysql一段时间之后,io一直很高,如下: 12:40:01 PM CPU %user %nice %system %iowait %steal %id ...

  3. python之块包导入

    一.模块 1.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写 ...

  4. paymob QB冲值接口

    static string PostPaymob() { string url = "http://www.paymob.cn/getorderinfo/index"; //统一分 ...

  5. Iterator和Iterable的区别以及使用

    Iterator和Iterable的区别以及使用   1.什么是迭代器 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址.迭代 ...

  6. caffe中的若干问题

    找不到cublas....: 在/etc/ld.so.conf文件夹中新建cuda.conf,里面添加/usr/local/cuda/lib64,然后sudo /sbin/ldconfig -v. c ...

  7. win7系统复制文件到u盘提示文件过大怎么办

    转载:https://www.xitmi.com/770.html 系统相信很多朋友都遇到过这种情况,在你拷贝文件到u盘时,u盘剩余空间明明很大,但是却复制不进去,电脑提示“对于目标文件系统 文件过大 ...

  8. Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password

    Centos7.5 执行ansible命令报错 问题: [root@m01 ~]# ansible servers -a "hostname" -i ./hosts -u root ...

  9. EMMC 介绍【转】

    本文转载自:https://blog.csdn.net/u014645605/article/details/52061034 定义: eMMC (Embedded Multi Media Card) ...

  10. JDBC编程的步骤

    一.进行JDBC编程的步骤大致如下: 1.      加载数据库驱动,通常使用Class类的forName()静态方法来加载驱动.如下代码: Class.forName(dirvirClass) 上面 ...