1,合并网格:先定义一个GameObject数组,利用CombineInstance进行合并网格,然后对mesh的CombineMeshes进行赋值(第一个参数是CombineInstance集合,第二个参数是子网格是否合并和第三个参数是矩阵)
2,材质合并:创建材质集合,用子网格SkinnedMeshRenderer类里的sharedMaterial为集合赋值,然后对网格的materials进行赋值
3,合并骨骼:创建骨骼数组,字典(骨骼名字为键,骨骼为值),创建玩家骨骼集合,根据骨骼的名字进行判断,字典里存在就添加到集合,然后对网格的bones进行赋值
代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreatePlayer : MonoBehaviour
{
public GameObject[] bodys;
// Start is called before the first frame update
void Start()
{
#region 网格合并
Mesh mesh = new Mesh();
List<CombineInstance> combines = new List<CombineInstance>();
for (int i = 0; i < bodys.Length; i++)
{
CombineInstance combine = new CombineInstance();
combine.mesh = bodys[i].GetComponentInChildren<SkinnedMeshRenderer>(). sharedMesh;
//combine.transform = bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().localToWorldMatrix;
combines.Add(combine);
}
mesh.CombineMeshes(combines.ToArray(), false, false);
GetComponent<SkinnedMeshRenderer>().sharedMesh = mesh;
#endregion
#region 材质合并
List<Material> materials = new List<Material>();
for (int i = 0; i < bodys.Length; i++)
{
materials.Add(bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial);
}
GetComponent<SkinnedMeshRenderer>().materials = materials.ToArray();
#endregion
#region 骨骼合并
Transform[] allbones = GetComponentsInChildren<Transform>();
Dictionary<string, Transform> dicbones = new Dictionary<string, Transform>();
foreach (var bone in allbones)
{
dicbones.Add(bone.name, bone);
}
List<Transform> mtbones = new List<Transform>();
for (int i = 0; i < bodys.Length; i++)
{
Transform[] bodybones = bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().bones;
for (int j = 0; j < bodybones.Length; j++)
{
if (dicbones.ContainsKey(bodybones[j].name))
{
mtbones.Add(dicbones[bodybones[j].name]);
}
}
GetComponent<SkinnedMeshRenderer>().bones = mtbones.ToArray();
}
#endregion
}
}