要学习unity3d人物换装首先要大致认识一下SkinnedMeshRenderer(蒙皮渲染组件)
我们要学习如何绑定如何换材质球和网格
1.代码
代码如下(示例):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Rehandling : MonoBehaviour
{
public Button eyes;//头发
public Button hair;//眼睛
public Button pants;//衣裳
public Button shoes;//裤子
public Button top;//鞋
public Transform Femaletarck;//要换衣服的小女孩模型
public Transform FemaleModel;//拥有整个资源的模型
public Transform[] Femaletarcks;//要所有小女孩所有的Transform
public Transform[] FemaleModels;//要整个资源模型的Transform
Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> pairs = new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>();//字典方便储存
Dictionary<string, GameObject> valuePairs = new Dictionary<string, GameObject>();
string[] vs = new string[] { "eyes-1", "face-1", "hair-1", "pants-1", "shoes-1", "top-1" };
// Start is called before the first frame update
void Start()
{
GainTransform();//初始化
Initialized();//换装的方法
eyes.onClick.AddListener(() =>//头发
{
Getdressed("eyes-2");
});
hair.onClick.AddListener(() =>//眼睛
{
Getdressed("hair-2");
});
pants.onClick.AddListener(() =>//衣裳
{
Getdressed("pants-2");
});
shoes.onClick.AddListener(() =>//裤子
{
Getdressed("shoes-2");
});
top.onClick.AddListener(() =>//鞋
{
Getdressed("top-2");
});
}
void GainTransform()//初始化
{
Femaletarcks=Femaletarck.GetComponentsInChildren<Transform>(true);//获取小女孩所有的Transform
FemaleModels = FemaleModel.GetComponentsInChildren<Transform>(true);//获取模型下所有的Transform
}
void Getdressed(string name)//换装的方法
{
string[] keys=name.Split('-');
if(pairs.ContainsKey(keys[0]))//判断是否已经穿上了
{
if(pairs[keys[0]].ContainsKey(keys[1]))
{
return;//如果已经穿上了直接返回
}
else//如果没有穿上
{
GameObject go;
if(valuePairs.TryGetValue(keys[0],out go))
{
Destroy(go);//销毁衣服
}
valuePairs.Remove(keys[0]);//移除
pairs.Remove(keys[0]);//移除
}
}
List<Transform> equipment = new List<Transform>();//保存
List<Transform> skeleton = new List<Transform>();//保存所有的骨骼
foreach (var item in FemaleModels)
{
if(item.name==name)//查找
{
Dictionary<string, SkinnedMeshRenderer> keyValues = new Dictionary<string, SkinnedMeshRenderer>();
keyValues.Add(keys[1], item.GetComponent<SkinnedMeshRenderer>());
pairs.Add(keys[0],keyValues);//存入
GameObject subassembly = new GameObject();//new一个空物体
subassembly.transform.SetParent(Femaletarck);//认父
valuePairs.Add(keys[0], subassembly);//保存
subassembly.name=item.name;
subassembly.AddComponent<SkinnedMeshRenderer>();//添加SkinnedMeshRenderer组件
subassembly.GetComponent<SkinnedMeshRenderer>().sharedMesh=item.GetComponent<SkinnedMeshRenderer>().sharedMesh;//网格
subassembly.GetComponent<SkinnedMeshRenderer>().materials = item.GetComponent<SkinnedMeshRenderer>().materials;//材质球
foreach (var items in item.GetComponent<SkinnedMeshRenderer>().bones)
{
foreach (var itemss in Femaletarcks)//在自己的骨骼中查找
{
if(items.name==itemss.name)
{
skeleton.Add(itemss);
subassembly.GetComponent<SkinnedMeshRenderer>().rootBone = itemss;// 是骨骼节点;
}
}
}
subassembly.GetComponent<SkinnedMeshRenderer>().bones = skeleton.ToArray();//所有相关的骨骼
}
}
}
public void Initialized()
{
for (int i = 0; i < vs.Length; i++)
{
Getdressed(vs[i]);
}
}
// Update is called once per frame
void Update()
{
}
}
例子
这边不让我传视频发个百度网盘链接在这
链接:https://pan.baidu.com/s/13jSXzZPJ9g1r1X_zZ2jVWw
提取码:bn9b