1.流程
2.代码
using System.Collections.Generic;
using UnityEngine;
public class 换装 : MonoBehaviour
{
SkinnedMeshRenderer sk;
public GameObject[] bodys;
void Start()
{
sk = GetComponent<SkinnedMeshRenderer>();
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;
combines.Add(combine);
}
mesh.CombineMeshes(combines.ToArray(), false, false);
sk.sharedMesh = mesh;
List<Material> materials = new List<Material>();
for (int i = 0; i < bodys.Length; i++)
{
materials.Add(bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial);
}
sk.materials = materials.ToArray();
//1.找到骨骼(Transform下的所有节点)
Transform[] mybones = GetComponentsInChildren<Transform>();
//2.将查找的骨骼通过名字放入字典
Dictionary<string, Transform> dic = new Dictionary<string, Transform>();
foreach (var item in mybones)
{
dic.Add(item.name, item);
}
//3.创建使用的骨骼集合
List<Transform> bones = new List<Transform>();
//4.查看不同得分身体不见需要通过哪块骨骼驱动
for(int i=0;i<bodys.Length;i++)
{
//驱动该身体部件的骨骼
Transform[] bodybone = bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().bones;
//找到所有骨骼
foreach (var item in bodybone)
{
//判断有没有该骨骼
if(dic.ContainsKey(item.name))
{
//使用自己的骨骼 只有穿在自己身上的衣服才会跟着自己动
bones.Add(dic[item.name]);
}
}
}
sk.bones = bones.ToArray();
}
// Update is called once per frame
void Update()
{
}
}
3.效果