设计思路
首先
我们可以先把拆分的资源给打开只读只写
我们之后就可以和上一篇博客 中的合并 一个思路
可以融合里面的mesh 和材质 我们不能改变uv 我们如果不小心改变了uv 就是一个很苦恼的事情
因为我们用的sharedMaterial 就会直接更改这个 材质的本身就会导致回不去了
我们就可以优化一下
加一个集合
添加进去
打错字了是恢复
好了 回归正题我们要换装了
骨骼是用变化的 我们是把衣服放在骨骼上 所以骨骼必须创建
public class 换衣服 : MonoBehaviour
{
SkinnedMeshRenderer sk; //蒙皮的网格渲染器 (
public GameObject[] bodys; //放入 prefab
void Start()
{
//添加蒙皮的网格渲染器
sk = gameObject.AddComponent<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>();//返回 GameObject 或其任何子项中类型为 type 的所有组件。
//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();
}