Unity 關於CombineMeshes的一點使用心得


類 Mesh

方法 public void CombineMeshes(CombineInstance[] combine)

例 mesh.CombineMeshes(combine)

1.參數combine 的數組長度不能大於int16, 如有大量Mesh需要合並, 需要分批次進行

2.mesh中原有的Mesh將會被combine 中Mesh所代替, 所以如果希望保留調用者Mesh中的mesh數據, 需要一並放進combine 數組中, 並在調用CombineMeshes方法之前為原mesh引用創建新的實例

下面的例子展示了創建4個cube: [g0, g1, g2, g3], 並將g1g2g3的模型合並到g0上, (注意: 本次合並操作對g1g2g3本身並無影響, 合並后的g0將會有4個cube模型)

void Awake () {
        GameObject g0 = GameObject.CreatePrimitive(PrimitiveType.Cube);

        GameObject g1 = GameObject.CreatePrimitive(PrimitiveType.Cube);
        g1.transform.position = new Vector3(10, 0, 0);
        GameObject g2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
        g2.transform.position = new Vector3(0, 10, 0);
        GameObject g3 = GameObject.CreatePrimitive(PrimitiveType.Cube);
        g3.transform.position = new Vector3(0, 0, 10);

        mergerCombine(g0, g1);
        mergerCombine(g0, g2);
        mergerCombine(g0, g3);
}

void mergerCombine(GameObject ori, GameObject tar)
{
        MeshFilter[] meshFilters1 = ori.GetComponents<MeshFilter>();
        MeshFilter[] meshFilters2 = tar.GetComponents<MeshFilter>();

        MeshFilter[] meshFilters = new MeshFilter[meshFilters1.Length + meshFilters2.Length];
        meshFilters1.CopyTo(meshFilters, 0);
        meshFilters2.CopyTo(meshFilters, meshFilters1.Length);
        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;
        }
        ori.transform.GetComponent<MeshFilter>().mesh = new Mesh();
        ori.transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM