创建如图所示的对象结构,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. docker 初步使用

    CentOS Linux release 7.2.1511 Docker version 17.03.1-ce 安装与启动 yum直接安装的docker版本较低,推荐这样安装: # 官方,可能网络连不 ...

  2. 八数码问题 Eight Digital Problem

    八数码问题 利用启发式搜索,找出以下问题的最优解. #include <iostream> #include <vector> #include <algorithm&g ...

  3. 观实验室PPT演讲有感

    outline 一定要有 说话的语速要慢,压制住紧张的心情 提前一天发布PPT dont` argue with audience, especially professor and teachers ...

  4. 尝试解决cifar10问题

    我理解这个问题和猫狗的不同,在于将2类扩展为10类,其它的地方我准备采用相同的方法. 注意事项: 1.我要用kaggle的数据集,而不是用其它的数据集: 2.最终得到的结果要以test为导向: 1.先 ...

  5. OO第三次博客作业---透过代码看设计

    不得不说的JSF 经过前几次作业的煎熬.出租车的代码量不断地增多.而出租车问题在不断的完善,这也就牵涉到一个问题,那就是最初出租车程序的设计问题,如果一开始设计的就有问题的话,那么在后来的过程中就会遇 ...

  6. VS2012创建ATL工程及使用MFC测试COM组件

    一.创建ATL工程 1.创建ATL项目,取名为ATLMyCom 2.在ATL项目向导中,勾选[支持MFC](利用MFC测试用).[支持 COM+ 1.0],其余的选项默认,点击完成. 3.右键工程名称 ...

  7. 从Git上导入Maven 项目到Eclipse

    Note: 经验之谈,操作过程中有不懂的地方可以留言问. Step: Open the Eclipse: --1.File>>Import>>Git:Project from ...

  8. checkbox勾选事件,JQ设置css,下拉框JQ选中

    <input id="CheckMainCompany" type="checkbox"/> $(function() { $("#Che ...

  9. git用法-打补丁【转】

    本文转载自:https://www.cnblogs.com/yandufeng/p/5580765.html 1. git cherry-pick 作用:从一个branch上选择一个commit,添加 ...

  10. 翻硬币|2013年蓝桥杯B组题解析第八题-fishers

    翻硬币 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:oooooo 如果同时翻转左 ...