Unity换装系统(SkinnedMeshRenderer)

世界杯男篮2019

【SiKi学院Unity】Unity换装系统【上】 【SiKi学院Unity】Unity换装系统【中】 【SiKi学院Unity】Unity换装系统【下】 课程资料.zip (71.93MB)

unity游戏换装系统【该全集有杂音】

原理

一个隐藏的,”穿着所有衣服“的模型 一个只有模型的骨骼的Target 给Target创建了6个部位,换装就是到模型那里取Transform,SkinnedMeshRenderer,加组件到部位节点上

04 游戏场景搭建

//Assets/Assets/Sources/Character/characters/prefabs //删除其他部位,只保留根节点 //跟模型(拖一份新的)一起放Resources

05 换装资源以及换装骨骼的加载

动画循环

//是下不是上

代码

public class AvatarSys : MonoBehaviour

{

[Tooltip("模型")] private GameObject model;

[Tooltip("模型位置")] private Transform modelTrans;

//

[Tooltip("目标骨架")] private GameObject target;

[Tooltip("骨骼信息")] private Transform[] hipArr;

[Tooltip("多个部位,多件装")] private Dictionary> dictionary = new Dictionary>();

// Start is called before the first frame update

void Start()

{

InstantiateModel("FemaleModel");

InstantiateTarget("FemaleTarget");

}

///

实例模型para />

void InstantiateModel(string name)

{

GameObject go = Instantiate(Resources.Load(name)) as GameObject;

modelTrans = go.transform;

go.SetActive(false);

}

///

实例骨骼

void InstantiateTarget(string name)

{

target= Instantiate(Resources.Load(name)) as GameObject;

hipArr = target.GetComponentsInChildren();

}

}

效果

//需要模型位置跟骨骼位置(在屋里),就赋值粘贴Transform

06 换装信息的数据存储

背景

//它的一个model是如下的命名

代码

public class AvatarSys : MonoBehaviour

{

void Start()

{

SaveDictionary();

}

///

存储服装信息

void SaveDictionary()

{

SkinnedMeshRenderer[] clothes = modelTrans.GetComponentsInChildren();

//比如eyes-1,取eyes(只取一次),拼成一套的部位部位

for (int i = 0; i < clothes.Length ; i++)

{

string[] nameArr=clothes[i].name.Split('-');

string part = nameArr[0];

string cloth = nameArr[1];

if (fixedPartDictionary.ContainsKey(part) == false)//部位字典里没有该部位

{

GameObject go = new GameObject();

go.name = part;

go.transform.parent = target.transform;

fixedPartDictionary.Add(part, go.AddComponent());

partsDictionary.Add(part, new Dictionary());//声明一个部位可以穿衣服

}

partsDictionary[ part ].Add(cloth, clothes[i]);//衣服字典都Add

}

}

}

效果

07 换装代码的逻辑实现

骨骼的Transform

代码

///

换衣服

void ChangeCloth(string part, string clothNum)

{

//选择一件衣服

SkinnedMeshRenderer newCloth = partsDictionary[part][clothNum];

//看衣服穿在哪里

List tmpList = new List();

foreach (var bone in newCloth.bones)//新衣服

{

foreach (var hip in hipArr)//目标骨骼。身上部位

{

if (bone.name

单独的近反义词
新无影剑艾格斯哪里爆?新无影爆率与超强属性