1. 程式人生 > >U3D實現簡單的網格合併

U3D實現簡單的網格合併

    /// <summary>
    /// 網格合併
    /// </summary>
    /// <param name="tr"></param>
    void CombineMesh(Transform tr)
    {
        MeshFilter[] meshFilters = tr.GetComponentsInChildren<MeshFilter>();//儲存Meshfilters

        MeshRenderer[] meshRenderers = tr.GetComponentsInChildren<MeshRenderer>();//儲存meshRenderers

        CombineInstance[] combineInstances = new CombineInstance[meshFilters.Length];//建立要儲存網格的陣列

        Material[] materials = new Material[meshRenderers.Length];//建立要儲存材質的陣列

        for (int i = 0; i < meshFilters.Length; i++)
        {
            combineInstances[i].mesh = meshFilters[i].sharedMesh;//儲存網格

            materials[i] = meshRenderers[i].sharedMaterial;//儲存材質

            combineInstances[i].transform = tr.worldToLocalMatrix * meshFilters[i].transform.localToWorldMatrix;//變換矩陣的問題,要保持相對位置不變,要轉換為父節點的本地座標,

            //刪除已經合併的原物體
            if (meshFilters[i].gameObject.name != tr.gameObject.name)
            {
                Destroy(meshFilters[i].gameObject);
            }
        }

        //構建新的網格
        tr.GetComponent<MeshFilter>().mesh = new Mesh();

        //傳遞儲存下來的網格
        tr.GetComponent<MeshFilter>().mesh.CombineMeshes(combineInstances,false);

        //傳遞已經儲存下來的材質
        tr.GetComponent<MeshRenderer>().sharedMaterials = materials;
    }