只合并网格
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; }