unity网格合并的用法

unity网格合并的用法
首先什么网格合并:多个mesh合并为一个mesh
有啥用:通俗来说就是GUP一小口一小口吃变成大口大口吃

两种方法:
1.自动合并网格
上一篇说了unity静态批处理和动态批处理
地址:https://blog.youkuaiyun.com/sakura_02/article/details/102515486
提到了勾选Static的GameObject下的Mesh都会被合入CombineMesh(无论什么材质),且每个Mesh都作为子网格存在,自动合并网格后,会根据材质是否相同来合批降低DrawCall,是内存换性能的方法
介绍一篇比较好的帖子,提到静态合批包大小的问题
https://blog.youkuaiyun.com/liweizhao/article/details/81937729
2.手动网格合并
手动合并网格可以按照我们的需求将多个mesh合并为一个mesh交给GPU处理,
实操一下,建一个脚本
附上代码:

using UnityEngine;
using System.Collections;

public class CombineMeshes : MonoBehaviour
{
      void Start()
    {

        //获取MeshRender;
        MeshRenderer[] meshRenders = GetComponentsInChildren<MeshRenderer>();

        //材质;
        Material[] mats = new Material[meshRenders.Length];
        for (int i = 0; i < meshRenders.Length; i++)
        {
            mats[i] = meshRenders[i].sharedMaterial;
        }

        //合并Mesh;
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();

        CombineInstance[] combine = new CombineInstance[meshFilters.Length];

        for (int i = 0; i < meshFilters.Length; i++)
        {
            combine[i].mesh = meshFilters[i].sharedMesh;
            combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            Destroy(meshFilters[i].gameObject);
        }

        MeshRenderer mr = gameObject.AddComponent<MeshRenderer>();
        MeshFilter mf = gameObject.AddComponent<MeshFilter>();
        mf.mesh = new Mesh();
        mf.mesh.CombineMeshes(combine, false);
        mr.sharedMaterials = mats;
        gameObject.SetActive(true);
      
    }
}

在这里插入图片描述
新建一个Cube和Sphere放在空对象Root下,Root挂上上面的脚本,运行在这里插入图片描述
可以看到root多了两个组件MeshFilter和MeshRender,Root下的对象被Destory了,但是Game视图中还是能看到,因为我们把cube和sphere的mesh合并到了一起,并在MeshRender里赋予了材质,所以即使销毁了还是能看见
在这里插入图片描述
这个是合并后的网格,有两个子网格submeshes,
注意一点,手动合并网格的时候不能把对象勾选为静态,勾选为静态后表明该对象会自动合并网格,手动合并就不起作用,大家可以试试看

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值