一、mesh合并大体分为:

1.合并网格

2.合并贴图

3.附加材质

4.重新计算UV

这里提一下附加材质,附加材质是对合并后的mesh重新赋予了一个material。废话不多说上代码!

备注:代码大多是整合的网上的资源,而且代码未优化!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CombineMesh : MonoBehaviour
{
    public Material combMat;//合并后赋予新mesh 的材质
    public GameObject[] needCombMeshAry;//需要合并的对象

void Start()
    {
        OrdinaryCombine();
    }

private void OrdinaryCombine()
    {
        float startTime = Time.realtimeSinceStartup;

List<CombineInstance> combineInstance = new List<CombineInstance>();
        List<Texture2D> textures = new List<Texture2D>();

List<Vector2[]> uvList = new List<Vector2[]>();
        int uvCount = 0;

int width = 0;
        int height = 0;

for (int i = 0; i<needCombMeshAry.Length; ++i) {

MeshRenderer renderer = needCombMeshAry[i].GetComponent<MeshRenderer>();
            MeshFilter filter = needCombMeshAry[i].GetComponent<MeshFilter>();

for (int k = 0; k< filter.sharedMesh.subMeshCount; ++k) {
                CombineInstance ci = new CombineInstance();
                ci.mesh = filter.sharedMesh;
                ci.subMeshIndex = k;

// 拿父节点的本地坐标*合并进来物体的世界坐标,得到合并进来物体相对父节点的偏移位置
                ci.transform = transform.worldToLocalMatrix * filter.transform.localToWorldMatrix;
                combineInstance.Add(ci);
            }

uvList.Add(filter.sharedMesh.uv);
            uvCount += filter.sharedMesh.uv.Length;

if (renderer.sharedMaterial.mainTexture != null) {
                textures.Add(renderer.sharedMaterial.mainTexture as Texture2D);
                width += renderer.sharedMaterial.mainTexture.width;
                height += renderer.sharedMaterial.mainTexture.height;
            }
        }

// 给合并的目标物体添加MeshRenderer和MeshFilter
        MeshRenderer tempRender = GetComponent<MeshRenderer>();
        if (!tempRender)
        {
            tempRender = gameObject.AddComponent<MeshRenderer>();
        }

MeshFilter tempFilter = GetComponent<MeshFilter>();
        if (!tempFilter)
        {
            tempFilter = gameObject.AddComponent<MeshFilter>();
        }

tempFilter.mesh = new Mesh();

// 合并网格,设置新材质
        tempFilter.mesh.CombineMeshes(combineInstance.ToArray(), true, true);
        tempRender.material = combMat;

// 将多个纹理放到一个集合包里面

Texture2D meshAtlas = new Texture2D(get2Pow(width), get2Pow(height));
        Rect[] packingResult = meshAtlas.PackTextures(textures.ToArray(), 0);
        Vector2[] atlasUVs = new Vector2[uvCount];

// 重新计算UV
        int counter = 0;
        for (int index = 0; index < uvList.Count; ++index)
        {
            foreach (Vector2 uv in uvList[index])
            {
                atlasUVs[counter].x = Mathf.Lerp(packingResult[index].xMin, packingResult[index].xMax, uv.x);
                atlasUVs[counter].y = Mathf.Lerp(packingResult[index].yMin, packingResult[index].yMax, uv.y);
                counter++;
            }
        }

// 设置贴图和UV
        tempRender.material.mainTexture = meshAtlas;
        tempFilter.mesh.uv = atlasUVs;

Debug.Log("合并耗时 : " + (Time.realtimeSinceStartup - startTime) * 1000 + " ms");
    }

private int get2Pow(int into) // 贴图最大不超过2的10次方,1024*1024
    {
        int outo = 1;
        for (int i = 0; i<10; ++i) {
            outo *= 2;
            if (outo > into) {
                break;
            }
        }

return outo;
    }
}

二、问题

在上述中,mesh合并没有什么问题。但我观察合并后的mesh时,发现有明显的切割边缘。直接上图如下:箭头指向部分就是合并后的mesh,几个凸多边形合并出来的都有类似这种问题。我这里猜测是不是模型边缘uv的问题。

求助各位帮助,当然我这边也会找解决办法。

Unity优化篇——mesh合并相关推荐

  1. Unity网格篇Mesh(一)

    程序代码实现网格 这里根据CSDNSpring5211的一篇文章,进行网格学习为网格材质合并作为一个基础 本文的目标 创建网格坐标 使用携程计算他们位置 利用三角形确定一个面 自动生成法线 添加纹理坐 ...

  2. 游戏开发优化篇之合并图集

    对于性能来说,很多情况都是用空间换时间. 然后在尽量减少空间的占用,在两者之间做抉择. 首先我们了解一下性能指标 帧率:每秒游戏循环执行的次数,即每秒多少帧 越高越好 drawcall: 一帧中游戏调 ...

  3. Unity优化篇 - 音频优化

    参考:[内存优化]Unity音频资源优化 - 知乎 在Unity项目中音频的优化不可缺少,在很多时候甚至会成为内存杀手. 这篇主要记录关于Unity内音频设置与音频优化的一些方法,有什么不对或缺少的地 ...

  4. Unity优化篇 - 图片资源优化

    这个主要是关于Unity当中图片资源,纹理贴图压缩格式相关的优化内容. 当我们把图片导入Unity的时候,在属性面板当中我们会根据不同平台进行格式压缩也就是Format选项.但是点开的时候会出现超多选 ...

  5. 【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次

    文章目录

  6. 【Unity优化篇】 | Unity脚本代码优化策略,快速获取 游戏对象 和 组件 的方法【文末送书】

  7. 【Unity优化篇】 | Unity脚本代码优化策略,空引用快速检索、使用合适的数据结构、禁用脚本和对象等 性能优化方法

  8. [Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格

    [Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格 本文并非原创,只是本人的学习记录,原文是由放牛的星星老师翻译Catlike系列教程 链接: https://mp.weixin.qq ...

  9. Unity优化之Graphics相关

    Unity优化之GraphicsCamera相关 // 像素px.分辨率.ppi.dpi.dp(dip) 屏幕尺寸(Screen Size): 屏幕对角线的长度.iPhone5屏幕尺寸为4英寸.iPh ...

最新文章

  1. 零基础入门学习Python(1)
  2. GitHub上的编程语言:JavaScript领衔Java次之
  3. 设计模式复习-原型模式
  4. 利用Navigation Timing测量页面加载时间
  5. iOS 远程通知(Remote Notification)和本地通知(Local Notification)
  6. Ant Design入门之布局
  7. 数据结构 - 赫夫曼树
  8. May 18:PHP 输出语句
  9. 互联网物流是计算机类吗,那些常常被误解的大学专业,亲戚眼中的修电脑送快递,网友:想哭...
  10. java mysql分层_java-数据库连接,分层实现增删改查测试
  11. 五万以内买什么车合适?
  12. 预训练的ONNX模型
  13. Vue2.0 之 自带浏览器里无法打开(兼容IE处理) - 解决方案 命令
  14. java与js的split方法
  15. Hibernate中一二级缓存使用详解
  16. 7塞班贝拉系统下载_远观JAVA,近观鸿蒙,盘点那些年我们用过的手机系统
  17. [nk] 2022牛客寒假算法基础集训营1 补题|题解
  18. 学习SpringBoot:知乎超赞回答:Java如何进阶?分享面经
  19. swift swiftJson 解析json
  20. HttpClient使用详解 get与post请求

热门文章

  1. 作业一:数据软件系统的介绍及spss的操作简介
  2. 难道主键除了自增就是GUID?支持k8s等分布式场景下的id生成器了解下
  3. windows系统下自定义图标
  4. 安卓如何查找应用的安装包目录?
  5. matlab获取基金数据,读取WIND数据(行情、基金净值等)的SAS程序
  6. 查看电脑连接过的无线网密码
  7. 字符串问题归类--C和C++
  8. 机械战警原型开发 - 仓田机器人
  9. 如何在微信h5拉起支付宝支付界面
  10. Electron 中的 webview 实战 —— 手写简易浏览器