合并网格 CombineMeshes ----将多个网格合并到此网格中。
mesh 网格
sub 子网格数量
tran 矩阵
light 光照贴图
首先把要合并的物体网格 创建
public MeshFilter[] filters; //网格过滤器
public MeshRenderer[] renderers;//网格渲染器
MeshFilter myfilter; //当前的网格过滤器
MeshRenderer meshRenderer;//当前网格渲染器
public Texture2D texture;//材质
// Start is called before the first frame update
void Start()
{
myfilter = transform.GetComponent<MeshFilter>(); //获得当前的网格过滤器
meshRenderer = transform.GetComponent<MeshRenderer>();//获得网格渲染器
List<Texture2D> textures = new List<Texture2D>();//存放 材质球 里面的贴图
for (int i = 0; i < renderers.Length; i++)
{
textures.Add(renderers[i].material.mainTexture as Texture2D);
}
//合并图片
texture = new Texture2D(0, 0);//创建新的材质
//获得合并后每个图片的矩形数组
Rect[] rects = texture.PackTextures(textures.ToArray(), 0);//将多个纹理打包到一个纹理图集中。
Mesh mesh = new Mesh();
//创建合并后每个图片的矩形数组
List<CombineInstance> combines = new List<CombineInstance>(); //
for (int i = 0; i < filters.Length; i++)
{
//计算合并图片后的uv坐标
Vector2[] newuv = new Vector2[filters[i].mesh.uv.Length];
for (int j = 0; j < newuv.Length; j++)
{
newuv[j] = new Vector2(rects[i].x + rects[i].width * filters[i].mesh.uv[j].x, rects[i].y + rects[i].height * filters[i].mesh.uv[j].y);
}
CombineInstance combine = new CombineInstance(); //结构,用于描述将使用 Mesh.CombineMeshes 组合的网格。
combine.mesh = filters[i].mesh;//要组合的 Mesh。
combine.mesh.uv = newuv;//uv
combine.transform = filters[i].transform.localToWorldMatrix;//矩阵,用于在组合前变换网格。
combines.Add(combine);
}
mesh.CombineMeshes(combines.ToArray(), true,true);
myfilter.mesh = mesh;
meshRenderer.material.mainTexture = texture;
}
把两个都物体拖入集合
材质可以为空因为我们要去直接绘制
执行后的mesh
小知识
这个是网格不能访问 我们去打开就可以
贴图
网格