UNITY 网格合并
UNITY 网格合并
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
public Avatar a;
// Use this for initialization
void Start () {
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
Debug.Log("meshFilters:" + meshFilters.Length);
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
MeshRenderer[] meshRendererList = GetComponentsInChildren<MeshRenderer>(); //获取自身和所有子物体中所有MeshRenderer组件
Material[] mats = new Material[meshRendererList.Length]; //新建材质球数组
Texture2D[] texList = new Texture2D[meshRendererList.Length];
int i = 0;
while (i < meshFilters.Length)
{
//mats[meshFilters.Length-i-1] = meshRendererList[i].sharedMaterial; //获取材质球列表
mats[i] = meshRendererList[i].sharedMaterial;
//
Color c = mats[i].color;
/*
* */
Texture2D tx = mats[i].GetTexture("_MainTex") as Texture2D;
Texture2D tx2D = new Texture2D(tx.width, tx.height, TextureFormat.ARGB32, false);
tx2D.SetPixels(tx.GetPixels(0, 0, tx.width, tx.height));
tx2D.Apply();
//
texList[i] = tx2D;
combine[i].mesh = meshFilters[i].sharedMesh;
//combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
combine[i].transform = transform.worldToLocalMatrix * meshFilters[i].transform.localToWorldMatrix;
meshFilters[i].gameObject.SetActive(false);
i++;
}
//
string shName = mats[0].shader.name;
Material matNew = new Material(mats[0].shader);
matNew.CopyPropertiesFromMaterial(mats[0]);
Texture2D texNew = new Texture2D(1024, 1024);
matNew.SetTexture("_MainTex", texNew);
Rect[] rects = texNew.PackTextures(texList, 0);//, 2048);
//
GameObject quad = GameObject.Find("Quad");
quad.GetComponent<MeshRenderer>().material.mainTexture = texNew;
Mesh meshNew = new Mesh();
//
i = 0;
while (i < meshFilters.Length)
{
int uvLen = combine[i].mesh.uv.Length;
Vector2[] uvData = combine[i].mesh.uv;
for(int j = 0;j< uvLen;j++)
{
uvData[j].x = uvData[j].x * rects[i].width + rects[i].x;
uvData[j].y = uvData[j].y * rects[i].height + rects[i].y;
}
//直接设不行
//combine[i].mesh.uv = uvData;
meshFilters[i].mesh.uv = uvData;
combine[i].mesh = meshFilters[i].mesh;
i++;
}
transform.GetComponent<MeshFilter>().mesh = meshNew;
transform.GetComponent<MeshFilter>().name = "xxx";
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, true);//,truefalse);////
//为合并后的GameObject指定材质
//transform.GetComponent<MeshRenderer>().sharedMaterials =mats;// materialNew;//
transform.GetComponent<MeshRenderer>().sharedMaterial = matNew;
transform.gameObject.SetActive(true);
}
// Update is called once per frame
void Update () {
}
}