unity换装

思路

首先需要一个包含所有装扮的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();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值