Unity性能优化篇(十) 模型优化之网格合并 Easy Mesh Combine Tool插件使用以及代码实现网格合并

把多个模型的网格合并为一个网格。可以使用自己写代码,使用Unity自带的CombineMeshes方法,也可以使用资源商店的插件,在资源商店搜Mesh Combine可以搜索到相关的插件,例如Easy Mesh Combine Tool等插件。

可大幅度减少Batches数量 减少模型的顶点、面、材质、骨骼、蒙皮网格。
写代码使用CombineMeshes方法实现网格合并:

1.测试脚本挂载在需要合并的物体身上

2.代码逻辑

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeshCombineTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        CombineTest();
    }

    public void CombineTest()
    {
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];
        Material[] mats = new Material[meshFilters.Length];
        Matrix4x4 matrix = transform.worldToLocalMatrix;
        for (int i = 0; i < meshFilters.Length; i++)
        {
            MeshFilter mf = meshFilters[i];
            MeshRenderer mr = meshFilters[i].GetComponent<MeshRenderer>();
            if (mr == null)
            {
                continue;
            }
            combine[i].mesh = mf.sharedMesh;
            combine[i].transform = mf.transform.localToWorldMatrix * matrix;
            mr.enabled = false;
            mats[i] = mr.sharedMaterial;
        }
        //新建一个物体 用来接收合并后的数据
        GameObject go = new GameObject("NewGameobject");
        go.AddComponent<MeshFilter>();
        go.AddComponent<MeshRenderer>();
        //赋值位置信息
        go.transform.localPosition = transform.localPosition;
        go.transform.localRotation = transform.localRotation;
        //赋值合并后的网格
        MeshFilter thisMeshFilter = go.GetComponent<MeshFilter>();
        Mesh mesh = new Mesh();
        mesh.name = "Combined";
        thisMeshFilter.mesh = mesh;
        mesh.CombineMeshes(combine, false);
        //赋值合并后的材质信息
        MeshRenderer thisMeshRenderer = go.GetComponent<MeshRenderer>();
        thisMeshRenderer.sharedMaterials = mats;
        thisMeshRenderer.enabled = true;

        MeshCollider thisMeshCollider = GetComponent<MeshCollider>();
        if (thisMeshCollider != null)
        {
            thisMeshCollider.sharedMesh = mesh;
        }
        //合并后隐藏自己
        gameObject.SetActive(false);
    }
}

3.最终结果展示

合并后物体属性的展示

使用Easy Mesh Combine Tool插件实现网格合并:

1.打开unity资源商店 搜索Mesh Combine 添加插件到我的资源

2.打开Package Manager 找到这个插件点击右下角Download

3.下载完毕点击导入

4.把需要合并的物体放在一个空节点下

5.打开插件 Window-->Easy Mesh Combine Tool 选中需要合并的物体点击插件面板的Make Group and Combine进行网格合并

6.合并完成预览

相关推荐
℡枫叶℡8 小时前
Unity - Import Activity Window 资源导入诊断信息窗口
unity·资源导入诊断
TO_ZRG10 小时前
Unity 证书校验
unity·游戏引擎
mxwin11 小时前
Unity Shader 切线空间数据是如何计算出来的
unity·游戏引擎·shader
南一Nanyi13 小时前
性能优化的方法论
前端·性能优化
mxwin15 小时前
Unity Shader 法线贴图跟切线空间有什么关系
unity·游戏引擎·贴图·shader
mxwin15 小时前
Unity Shader 贴图和采样的关系 如何保证贴图清晰
unity·游戏引擎·贴图·shader
兰令水16 小时前
leecodecode【回溯子集】【2026.6.4打卡-java版本】
java·开发语言·深度优先
心前阳光17 小时前
Unity之使用火山引擎实现文字提问流式回复
unity·游戏引擎·火山引擎
SilentSamsara17 小时前
缓存策略实战:Redis + Python 多级缓存设计与失效策略
开发语言·redis·python·缓存·性能优化