通过组合的达到换装效果

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Huanzhaung1 : MonoBehaviour
{
//蒙皮网格渲染器
SkinnedMeshRenderer skinned;
public GameObject[] bodys;
Dictionary<string, Transform> dicbones = new Dictionary<string, Transform>();
// Start is called before the first frame update
void Start()
{
skinned = gameObject.AddComponent<SkinnedMeshRenderer>();//给骨骼添加蒙皮网格渲染器
Transform[] allbones = GetComponentsInChildren<Transform>();//获取所有子级的transform


for (int i = 0; i < allbones.Length; i++)//遍历所有子级
{
dicbones.Add(allbones[i].name, allbones[i]);//将所有子级添加进字典 方便后边查找
}
}
public void Huan()
{
List<CombineInstance> combines = new List<CombineInstance>();//创建动态合并对象集合
List<Material> materials = new List<Material>();//创建材质球集合
List<Transform> bones = new List<Transform>();//这是等会自身赋值的集合


for (int i = 0; i < bodys.Length; i++)//遍历你要换装的那个数组
{
SkinnedMeshRenderer sk = bodys[i].GetComponentInChildren<SkinnedMeshRenderer>();//将每个需要换装的身体部位的子级的蒙皮网格渲染器获取到
CombineInstance combine = new CombineInstance();//创建动态合并对象
combine.mesh = sk.sharedMesh;//将动态合并对象赋值
combines.Add(combine);//将动态合并对象添加到集合
materials.Add(sk.sharedMaterial);//添加材质球
for (int j = 0; j < sk.bones.Length; j++)//遍历你的获取到的子级的蒙皮网格渲染器里边的骨骼数组
{
if (dicbones.ContainsKey(sk.bones[j].name))//判断之前放入字典中的所有骨头有没有和需要换装的骨头的名称一致的
{
bones.Add(dicbones[sk.bones[j].name]);//如果有就把骨头放入等会给自身赋值的集合
}
}
}
Mesh mesh = new Mesh();
mesh.CombineMeshes(combines.ToArray(), false, false);//将所有网格进行合并
skinned.sharedMesh = mesh;//网格赋值
skinned.materials = materials.ToArray();//材质球赋值
skinned.bones = bones.ToArray();//骨骼数组赋值
}
// Update is called once per frame
void Update()
{

}
}

posted @ 2022-12-30 18:37  old_Host  阅读(13)  评论(0编辑  收藏  举报