1. 程式人生 > >unity實現換裝系統

unity實現換裝系統

etc lda skin renderer material bject one targe ldr


public class AvatarSys : MonoBehaviour
{

//private GameObject girlSource;//資源model
private Transform girlSourceTrans;
private GameObject girlTarget;//骨架物體
private Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> girlData = new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>();
Transform[] girlHips;//小女孩骨骼信息
private Dictionary<string, SkinnedMeshRenderer> girlSmr = new Dictionary<string, SkinnedMeshRenderer>();//換裝骨骼身上的skm信息
private string[,] girlStr = new string[,] { { "eyes", "1" }, { "hair", "1" }, { "top", "1" }, { "pants", "1" }, { "shoes", "1" }, { "face", "1" } };

private void Start()
{
InstantiateSource();
InstantiateTarget();
SaveData();
InitAvatart();
}

void InstantiateSource()
{
GameObject Go = Instantiate(Resources.Load("FemaleModel")) as GameObject;
girlSourceTrans = Go.transform;
Go.SetActive(false);
}

void InstantiateTarget()
{
girlTarget = Instantiate(Resources.Load("FemaleTarget")) as GameObject;
girlHips = girlTarget.GetComponentsInChildren<Transform>();
}

void SaveData()
{
if (girlSourceTrans == null)
return;
//遍歷所有子物體有SkinedMeshRenderer
SkinnedMeshRenderer[] parts = girlSourceTrans.GetComponentsInChildren<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;
girlSmr.Add(names[0], partGo.AddComponent<SkinnedMeshRenderer>());//把骨骼target身上的skm信息存儲
girlData.Add(names[0], new Dictionary<string, SkinnedMeshRenderer>());
}
girlData[names[0]].Add(names[1], part);//存儲所以的skm信息到數據裏面
}
}

void ChangeMesh(string part, string num)
{//傳入部位,編號,從data裏面拿取對應的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;
}
}
}
//換裝的實現
girlSmr[part].bones = bones.ToArray();
girlSmr[part].materials = skm.materials;
girlSmr[part].sharedMesh = skm.sharedMesh;
}

void InitAvatart()
{
//初始化骨架,讓他有mesh材質 骨骼信息
int length = girlStr.GetLength(0);//獲得行數
for (int i = 0; i < length; i++)
{
ChangeMesh(girlStr[i, 0], girlStr[i, 1]);//讓角色穿
}
}
}

unity實現換裝系統