Unity --- MeshRenderer之网格合并

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

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class CombineMeshAndMaterials : MonoBehaviour
 5 {
 6     void Start()
 7     {
 8         CombineMesh();
 9     }
10     void CombineMesh()
11     {
12         //收集要合并的贴图
13         MeshRenderer[] oldMRArray = GetComponentsInChildren<MeshRenderer>();
14         Material[] oldMArray = new Material[oldMRArray.Length];
15         Texture2D[] textures = new Texture2D[oldMRArray.Length];
16         for (int i = 0, iMax = oldMRArray.Length; i < iMax; ++i)
17         {
18             oldMArray[i] = oldMRArray[i].sharedMaterial;
19             Texture2D t2d = oldMArray[i].GetTexture("_MainTex") as Texture2D;
20             Texture2D _t2d = new Texture2D(t2d.width, t2d.height, TextureFormat.ARGB32, false);
21             _t2d.SetPixels(t2d.GetPixels(0, 0, t2d.width, t2d.height));
22             _t2d.Apply();
23             textures[i] = _t2d;
24         }
25 
26         //创建合并后的材质
27         MeshRenderer newMR = gameObject.AddComponent<MeshRenderer>();
28         Material newM = new Material(oldMArray[0].shader);
29         newM.CopyPropertiesFromMaterial(oldMArray[0]);
30         newMR.sharedMaterial = newM;
31 
32         //创建合并后的贴图,
33         Texture2D newTex = new Texture2D(1024, 1024);
34         newM.SetTexture("_MainTex", newTex);   //将合并后的贴图赋给合并后的材质
35 
36         //重新计算贴图UV
37         MeshFilter[] oldMF = GetComponentsInChildren<MeshFilter>();
38         CombineInstance[] combines = new CombineInstance[oldMF.Length];
39         Rect[] rects = newTex.PackTextures(textures, 10, 1024);  //贴图打包 ,矩形的数组包含每个输入的纹理的UV坐标
40         for (int i = 0, iMax = oldMF.Length; i < iMax; ++i)
41         {
42             Rect rect = rects[i];
43             Mesh mesh = oldMF[i].mesh;
44             Vector2[] newUVs = new Vector2[mesh.uv.Length];
45 
46             //刷新uv
47             for (int j = 0, jMax = mesh.uv.Length; j < jMax; ++j)
48             {
49                 //如果这里看不太懂,说明对uv的确切含义不太明白
50                 //uv是一个比值,u = 横向第u个像素/原始贴图的宽度    v = 竖向第v个像素/原始贴图的高度
51                 //rect.x : 原贴图在合并后的贴图的 x 坐标,  rect.y : 原贴图在合并后的贴图的 y 坐标
52                 newUVs[j].x = mesh.uv[j].x * rect.width + rect.x;
53                 newUVs[j].y = mesh.uv[j].y * rect.height + rect.y;
54             }
55             mesh.uv = newUVs;
56             combines[i].mesh = mesh;
57             combines[i].transform = oldMF[i].transform.localToWorldMatrix;  //没有这句,合并后的网格无法看到
58             oldMF[i].gameObject.SetActive(false);
59         }
60 
61         //创建合并后的网格
62         MeshFilter newMF = gameObject.AddComponent<MeshFilter>();
63         Mesh newMesh = new Mesh();
64         newMesh.CombineMeshes(combines, true, true);
65         newMF.mesh = newMesh;
66     }
67 }

转载于:https://www.cnblogs.com/luguoshuai/p/10513304.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 盒模型的属性

1、盒模型 2、display 3、浮动转载于:https://www.cnblogs.com/Tang854416/p/9676424.html

前后端分离

、前后端分离的好处 &#xff08;1&#xff09;彻底解放前端 &#xff08;2&#xff09;提高工作效率&#xff0c;分工更加明确。 &#xff08;3&#xff09;局部性能提升 &#xff08;4&#xff09;降低维护成本 2、前后端分离的概念 后台只需要提供API接口&#xff0c;…

Win10还原被Windows Defender隔离的文件

Win10最新版本的Windows Defender隔离/删除的文件没有还原的选项&#xff0c;导致很多破解文件或是注册机直接隔离&#xff0c;到威胁历史记录中去却无法恢复。经过各个尝试&#xff0c;到微软官方论坛中也尝试了很多方法&#xff0c;后来发现竟然恢复啦。各位小伙伴可以试试这…

AtCoder Grand Contest 013 题解

A - Sorted Arrays 贪心&#xff0c;看看不下降和不上升最长能到哪&#xff0c;直接转移过去即可。 1 //waz2 #include <bits/stdc.h>3 4 using namespace std;5 6 #define mp make_pair7 #define pb push_back8 #define fi first9 #define se second 10 #define ALL(x…

servlet架构解析

https://www.jianshu.com/p/d433b5fb87e2

(Review cs231n) Backpropagation and Neural Network

损失由两部分组成&#xff1a; 数据损失正则化损失&#xff08;data loss regularization&#xff09; 想得到损失函数关于权值矩阵W的梯度表达式&#xff0c;然后进性优化操作&#xff08;损失相当于海拔&#xff0c;你在山上的位置相当于W&#xff0c;你进行移动&#xff0c…

springboot restful

https://www.jianshu.com/p/733d788ea94d

【计算机算法设计与分析】——排序

一.排序 二.插入排序 &#xff08;1&#xff09;算法描述 &#xff08;2&#xff09;性能分析 &#xff08;3&#xff09;寻求优化 三.归并排序 &#xff08;1&#xff09;算法思想 &#xff08;2&#xff09;性能分析 &#xff08;2&#xff09;示例 &#xff08;3&#xff09…

QT 随机数生成

下面总结了QT中随机生成的方法&#xff08;仅供学习参考&#xff09;&#xff0c;分为旧方法和新方法&#xff0c;一般来说&#xff0c;旧的方法已经被抛弃&#xff0c;在开发新的应用中推荐使用新方法。 C Code 123456789101112131415161718192021222324#include <QCoreApp…

获取/设置IFRAME内对象元素的几种JS方法

获取/设置IFRAME内对象元素的几种JS方法 iframe浏览器ie文档微软&#xff11;。IE专用(通过frames索引形象定位)&#xff1a; document.frames[i].document.getElementById(元素的ID); &#xff12;。IE专用(通过IFRAME名称形象定位)&#xff1a; document.frames[iframe的name…

高并发

https://blog.csdn.net/java_xth/article/details/81162088

多人游戏服务器

https://www.getmangos.eu/转载于:https://www.cnblogs.com/aibox222/p/9682697.html

Hbase 各个角色的工作。

HMaster的作用&#xff1a; 为region server 分配region&#xff1b;负责region server的负载均衡&#xff0c;region分裂完成监控&#xff1b;处理schema更新请求&#xff0c;数据表的创建&#xff0c;更新&#xff1b;HDFS上的垃圾文件回收&#xff1b;发现失效的region serv…

Activiti中的关于子流程中的并发节点标记处理

最近在研究一个轻量级的工作流引擎Activiti&#xff0c;就遇到了子流程中无法标记其并发节点的问题&#xff0c;经过几天的研究&#xff0c;想到了一个简单易懂的方法&#xff0c;总结如下&#xff0c;希望对你们能有所帮助&#xff0c;有写的不对的地方&#xff0c;还希望大家…

[WPF 基础知识系列] —— 绑定中的数据校验Vaildation

[WPF 基础知识系列] —— 绑定中的数据校验Vaildation 原文:[WPF 基础知识系列] —— 绑定中的数据校验Vaildation前言&#xff1a; 只要是有表单存在&#xff0c;那么就有可能有对数据的校验需求。如&#xff1a;判断是否为整数、判断电子邮件格式等等。 WPF采用一种全新的方式…

ModuleNotFoundError: No module named 'win32api'

启动一个工程的cmd&#xff1a; scrapy crawl HI 如果 运行报 No module named “win32api” 要安装 pip install pypiwin32 这个包转载于:https://www.cnblogs.com/hailong88/p/10528618.html

powercmd注册码

用户名&#xff1a;nzone注册码&#xff1a;PCMDA-86128-PCMDA-70594 http://www.baidu.com/

Servlet其实是单例多线程

https://blog.csdn.net/xiaojiahao_kevin/article/details/51781946

解决“跨域问题”的几种方法

&#xff08;0&#xff09;使用注解方式&#xff0c;这个可能有些框架可以&#xff0c;有些不行&#xff0c;在要访问的方法前面加上此注解即可&#xff1a; CrossOrigin &#xff08;1&#xff09;使用 Access-Control-Allow-Origin 设置请求响应头&#xff0c;简洁有效。 &am…

Conda 安装本地包

有的conda或pipy源太慢&#xff0c;conda install xxx或者pip install xxx下载会中断连接导致压缩包下载不全&#xff0c;本地的安装包没法完全安装, 遇到这个问题时&#xff0c;我们可以用p2p工具-迅雷等先下载指定包再用conda或pip安装 pip 安装本地包pip install D:\XXX.w…