只合并网格

public GameObject[] objs;
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = new Mesh();
        //   合并网格组件
        List<CombineInstance> combines = new List<CombineInstance>();
        List<Material> materials = new List<Material>();//材质
        for (int i = 0; i < objs.Length; i++)
        {
            CombineInstance combine = new CombineInstance();
            combine.mesh = objs[i].GetComponent<MeshFilter>().mesh;//获取每个obj的网格
            combine.transform = objs[i].transform.localToWorldMatrix;//矩阵坐标自身到世界
            combines.Add(combine);
            materials.Add(objs[i].GetComponent<MeshRenderer>().material);//获取材质
        }
        //合并网格 参数一CombineInstance集合,
        //参数二为bool类型的(是否将所有mesh合并),false使用不同材质,true 使用同一材质
        //参数三为bool类型(是否使用矩阵)如果为false,那么CombineInstance里的transform将会被忽略,所有mesh都会从local原点开始           
        mesh.CombineMeshes(combines.ToArray(), false);
        GetComponent<MeshFilter>().mesh = mesh;
        GetComponent<MeshRenderer>().materials = materials.ToArray();
    }

 

合并网格、图集

public GameObject[] objs;
    public Texture2D texture;
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = new Mesh();
        //   合并网格组件
        List<CombineInstance> combines = new List<CombineInstance>();
        List<Texture2D> textures = new List<Texture2D>();//纹理
        for (int i = 0; i < objs.Length; i++)
        {
            textures.Add(objs[i].GetComponent<MeshRenderer>().material.mainTexture as Texture2D);//获取纹理
        }
        //合并图集
        texture = new Texture2D(0, 0);
        Rect[] rects = texture.PackTextures(textures.ToArray(), 0);
        
        List<Vector2[]> olduvlist = new List<Vector2[]>();
        //修改uv坐标要在合并之前
        for (int i = 0; i < objs.Length; i++)
        {
            CombineInstance combine = new CombineInstance();
            combine.mesh = objs[i].GetComponent<MeshFilter>().mesh;//获取每个obj的网格
            combine.transform = objs[i].transform.localToWorldMatrix;//矩阵坐标自身到世界
            combines.Add(combine);
            Vector2[] olduv = combine.mesh.uv;
            olduvlist.Add(olduv);
            Vector2[] newuv = new Vector2[olduv.Length];
            for (int j = 0; j < olduv.Length; j++)
            {
                float uvx = rects[i].x + rects[i].width * olduv[j].x;
                float uvy = rects[i].y + rects[i].height * olduv[j].y;
                newuv[j]=new Vector2(uvx,uvy);
            }
            combine.mesh.uv = newuv;
        }
        //合并网格 参数一CombineInstance集合,       
        mesh.CombineMeshes(combines.ToArray());

        // 合并完网格就可以还原uv坐标
        for (int i = 0; i < olduvlist.Count; i++)
        {
            objs[i].GetComponent<MeshFilter>().mesh.uv = olduvlist[i];
        }
        GetComponent<MeshFilter>().mesh = mesh;
        Material material = new Material(Shader.Find("Standard"));
        material.mainTexture = texture;
        GetComponent<MeshRenderer>().material = material;
    }

 

 

posted on 2023-03-03 19:31  a帝  阅读(14)  评论(0编辑  收藏  举报