1:合并mesh 和 材质球, 挂在对象上,运行场景即可。(父物体必须有mesh和材质球)
using UnityEngine;
using System.Collections;public class Combine_Test : MonoBehaviour
{
// Use this for initialization
void Start()
{
//---------------- 先获取材质 -------------------------
//获取自身和所有子物体中所有MeshRenderer组件
MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();
//新建材质球数组
Material[] mats = new Material[meshRenderers.Length];
for (int i = 0; i < meshRenderers.Length; i++)
{
//生成材质球数组
mats[i] = meshRenderers[i].sharedMaterial;
}
//---------------- 合并 Mesh -------------------------
//获取自身和所有子物体中所有MeshFilter组件
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
for (int i = 0; i < meshFilters.Length; i++)
{
combine[i].mesh = meshFilters[i].sharedMesh;
//矩阵(Matrix)自身空间坐标的点转换成世界空间坐标的点
//combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
combine[i].transform = transform.worldToLocalMatrix * meshFilters[i].transform.localToWorldMatrix;
meshFilters[i].gameObject.SetActive(false);
}
//为新的整体新建一个mesh
transform.GetComponent<MeshFilter>().mesh = new Mesh();
//合并Mesh. 第二个false参数, 表示并不合并为一个网格, 而是一个子网格列表
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);
transform.gameObject.SetActive(true);
//为合并后的新Mesh指定材质 ------------------------------
transform.GetComponent<MeshRenderer>().sharedMaterials = mats;
}
}
2:只合并mesh 并 保存
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//合并 挂在对象上
public class MyMeshClass : MonoBehaviour
{
void Start()
{
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
int i = 0;
while (i < meshFilters.Length)
{
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++;
}
transform.GetComponent<MeshFilter>().mesh = new Mesh();
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
transform.gameObject.SetActive(true);
}
}
//保存合并后新生成的Mesh 此脚本放在Edit文件夹下,不然发布会报错
using UnityEngine;
using System.Collections;
using UnityEditor;
public class EditorTools : MonoBehaviour
{
[MenuItem("Tools/Save Combine Mesh")]
public static void SaveMesh()
{
Mesh m = Selection.activeGameObject.GetComponent<MeshFilter>().sharedMesh;
AssetDatabase.CreateAsset(m, "Assets/cmbMesh.asset");
AssetDatabase.SaveAssets();
}
}