Unity——Mesh合并,以及SkinMeshRenderer合并

Unity——Mesh合并,当遇到多个SkinMeshRenderer 合并时的一个坑

先讲个Mesh合并的例子

1.先建立两个物体,把一个物体挂到另外个物体下面
在这里插入图片描述
在Cube1 上挂上一下脚本

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

public class Test : MonoBehaviour {

    void Start () {
        Matrix4x4 matrix = transform.worldToLocalMatrix;

        //网格数组
        MeshFilter[] meshFilters = this.GetComponentsInChildren<MeshFilter>();
        CombineInstance[] combineInstances = new CombineInstance[meshFilters.Length];
        for (int i = 0; i < meshFilters.Length; ++i)
        {
            combineInstances[i].mesh = meshFilters[i].sharedMesh;
            combineInstances[i].transform = meshFilters[i].transform.localToWorldMatrix * matrix;
        }

        //材质数组
        Material[] materials = new Material[meshFilters.Length];
        MeshRenderer[] meshRenders = this.GetComponentsInChildren<MeshRenderer>();
        for (int i = 0; i < meshRenders.Length; ++i)
        {
            materials[i] = meshRenders[i].sharedMaterial;
        }

        //新建网格容器
        Mesh newMesh = new Mesh();
        newMesh.name = "newMesh";
        //新网格赋值给当前mesh
        MeshFilter mf = this.GetComponent<MeshFilter>();
        mf.mesh = newMesh;
        //合并网格
        newMesh.CombineMeshes(combineInstances, false); //第二个参数的意思,如果为false,则表明有多个材质;如果是true,则表明一个材质。
        //如果是false的话,合并完的Mesh,那么就会有多个submesh,理应对应多个Material。
        //如果是true的话,那么合并完的mesh就只有一个submesh,理应对对应1个Material。
        //材质赋值
        MeshRenderer mr = this.GetComponent<MeshRenderer>();
        mr.sharedMaterials = materials;


        //这里针对多个skinmesh合并 发现当mesh包含多个submeshes时,合并成功后,无法渲染显示出来。
        //解决: ci.mesh.triangles = smr.sharedMesh.triangles  必须重新指定三角形

        //SkinnedMeshRenderer[] allSkineMeshList;
        //List<CombineInstance> combineInstances = new List<CombineInstance>();
        //foreach (SkinnedMeshRenderer smr in allSkineMeshList)
        //{
        //    for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++)
        //    {
        //        CombineInstance ci = new CombineInstance();
        //        ci.mesh = smr.sharedMesh;
        //        ci.mesh.triangles = smr.sharedMesh.triangles; //这里重新    指定包含网格中所有三角形的数组。

        //        ci.subMeshIndex = sub;
        //        ci.transform = matrix * smr.transform.localToWorldMatrix;
        //        combineInstances.Add(ci);
        //    }
        //}

    }
}

在这里插入图片描述
生成新的网格和材质赋值给Cube1,
在这里插入图片描述
当遇到多个SkinMeshRenderer 合并时,合并成功后,无法渲染显示出来。
这个是因为没有重新指定三角面

对于不清楚SkinnedMeshRenderer和CombineInstance
下面有官方两篇文章的解释

SkinnedMeshRenderer的官方解释
CombineInstance的官方解释

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值