思路
首先需要一个包含所有装扮的SourceModel,根据SourceModel创建TargetModel,TargetModel是SourceModel的骨骼。
然后创建
SourcePersonSmr字典(Dictionary<string,Dictionary<string,SkinnedMeshRenderer>>)来保留SourceModel上所有smr的信息(包括 bones,mesh, material )
TargetPersonSmr字典(Dictionary<string,SkinnedMeshRenderer>)来添加和保存TargetModel上的smr
TargetModelHips(Transform[])来保存TargModel上骨骼结点
俩个游戏物体PersonSource和PersonTarget(GameObject)保存从资源中加载出来的游戏物体。
还需要一个装扮名的二维字符串数组ChangeName(string[,])
加载游戏物体
GameObject InstantiateSouce(string name){
return Instantiate(Resources.Load(name)) as GameObject;
}
GameObject InstantiateTarget(string name){
return Instantiate(Resources.Load(name)) as GameObject;
}
PersonSource = InstantiateSouce("FemaleModel");
PersonTarget = InstantiateTarget("FemaleTarget");
保存SourPersonSmr
Dictionary<string,Dictionary<string,SkinnedMeshRenderer>> saveSourceData(GameObject PersonSource){
if(PersonSource == null){
print("personsource is null");
return null;
}
SkinnedMeshRenderer[] parts = PersonSource.GetComponentsInChildren<SkinnedMeshRenderer>();
Dictionary<string,Dictionary<string,SkinnedMeshRenderer>> personData = new Dictionary<string,Dictionary<string,SkinnedMeshRenderer>>();
foreach(var part in parts){
string[] name = part.name.Split('-');
if(!personData.ContainsKey(name[0])){
personData.Add(name[0],new Dictionary<string, SkinnedMeshRenderer>());
}
personData[name[0]].Add(name[1],part);
}
return personData;
}
SourcePersonSmr= saveSourceData(PersonSource);
保存TargetPersonSmr
Dictionary<string,SkinnedMeshRenderer> creatTargetSmr(GameObject PersonSource, GameObject PersonTarget);{
if(PersonSource == null)return null;
// Debug.Log("1");
SkinnedMeshRenderer[] parts = PersonSource.GetComponentsInChildren<SkinnedMeshRenderer>();
Dictionary<string,SkinnedMeshRenderer> personTargetSmr = new Dictionary<string,SkinnedMeshRenderer>();
foreach(var part in parts){
string[] name = part.name.Split('-');
// if(name == null){
// Debug.Log("name is null");
// }
// Debug.Log(name[0]);
if(!personTargetSmr.ContainsKey(name[0])){
GameObject partGo = new GameObject();
partGo.name = name[0];
partGo.transform.parent = target.transform;
personTargetSmr.Add(name[0],partGo.AddComponent<SkinnedMeshRenderer>());
}
}
return personTargetSmr;
}
TargetPersonSmr = creatTargetSmr(PersonSource, PersonTarget);
保存TargetModelHips
Transform[] saveTragetTF(GameObject PersonTarget){
return PersonTarget.transform.GetComponentsInChildren<Transform>();
}
TargetModelHips = saveTragetTF(PersonTarget);
创建一个有装扮名的和序号的二位数组
string[,] Chang'Name = new string[,]{{"eyes","1"},{"face","1"},{"hair","1"},{"pants","1"},{"shoes","1"},{"top","1"}};
一个换装函数
void ChangeMesh(Dictionary<string,SkinnedMeshRenderer> TargetPersonSmr, string part, string num,
Dictionary<string,Dictionary<string,SkinnedMeshRenderer>> SourcePersonSm, Transform[] TargetModelHips){
SkinnedMeshRenderer skm = SourcePersonSm[part][num];
List<Transform> bones = new List<Transform>();
foreach(var trans in skm.bones){
foreach(var bone in TargetModelHips){
if( trans.name == bone.name){
bones.Add(bone);
break;
}
}
}
TargetPersonSmr[part].bones = bones.ToArray();
TargetPersonSmr[part].material = skm.material;
TargetPersonSmr[part].sharedMesh = skm.sharedMesh;
}
对PresonTarget装扮进行初始化
void initializationPresonTargetl(){
for(int i=0; i < ChangeName.GetLength(0); i++){
ChangeMesh(girlskm, ChangeName[i,0] , ChangeName[i,1], SourcePersonSmr, TargetModelHips);
}
PersonSource.SetActive(false);
}
void initializationPresonTargetl();