今天完成了换装代码的部分逻辑实现。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AvatarSys : MonoBehaviour
{
private GameObject GirlSource;//资源model
private GameObject GirlTarget;//骨架,换装的人
private Transform GirlSourceTrans;
private Transform GirlTargetTrans;
private Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> girlData = new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>();
//新建字典,根据Key数的值来获取Value,得到小女孩的所有资源信息
private Dictionary<string, SkinnedMeshRenderer> Smr = new Dictionary<string, SkinnedMeshRenderer>();
//换装骨骼身上的SkinnedMeshRenderer信息
Transform[] GirlHips;//小女孩骨骼信息
public Transform OccurPosition;
// Start is called before the first frame update
void Start()
{
InstantiateSource();
InstantiateTarget();
GirlHips = GirlTarget.GetComponentsInChildren<Transform>();
SaveData();
}
void InstantiateSource()
{
GirlSource = Instantiate(Resources.Load("FemaleModel")) as GameObject;//加载资源物体
GirlSourceTrans = GirlSource.transform;
GirlSource.SetActive(false);
}
void InstantiateTarget()
{
GirlTarget = Instantiate(Resources.Load("FemaleTarget")) as GameObject;
}
void SaveData()
{
if (GirlSourceTrans == null)
return;
SkinnedMeshRenderer[] parts = GirlSourceTrans.GetComponentsInChildren<SkinnedMeshRenderer>();
//遍历所有子物体有SkinnedMeshRenderer的进行存储
foreach (var part in parts)
{
string[] names = part.name.Split('-');
if (!girlData.ContainsKey(names[0]))
{
//生成对应的部位且只生成一个
GameObject partGo = new GameObject();
partGo.name = names[0];
partGo.transform.parent = GirlTarget.transform;
Smr.Add(names[0], partGo.GetComponent<SkinnedMeshRenderer>());
//把骨骼身上的skm信息存储到换装中
girlData.Add(names[0], new Dictionary<string, SkinnedMeshRenderer>());
}
girlData[names[0]].Add(names[1],part);//存储所有的Smr信息到字典
}
}
void ChangeMesh(string part,string num)//传入部位编号,从girldata里面拿对应的skm
{
SkinnedMeshRenderer skm = girlData[part][num];//要更换的部位
List<Transform> bones = new List<Transform>();
foreach (var trans in skm.bones)
{
foreach (var bone in GirlHips)
{
if (bone.name == trans.name)
{
bones.Add(bone);
break;
}
}
}
Smr[part].bones = bones.ToArray();
Smr[part].materials = skm.materials;
Smr[part].sharedMesh = skm.sharedMesh;
}
// Update is called once per frame
void Update()
{
}
}
//第一次的一直报错,是由于Resources目录拼成了Resource,而Resources.Load传入的是Resources的资源名