为了提高游戏性能,需要对人物进行换装后,讲人物各个部分再进行组合,形成一个整体的网格,所以需要合并网格,骨骼,材质等。
下面是从Resources中加载人物各个部分,然后再组装。
首先加载的骨骼,再加载其他部分。
void LoadResource()
{
GameObject go = Resources.Load<GameObject>("Female_bone");
GameObject bone = (GameObject)Instantiate(go);
boneChildren = bone.GetComponentsInChildren<Transform>();
List<Material> mats = new List<Material>();
List<Transform> bones = new List<Transform>();
List<CombineInstance> cis = new List<CombineInstance>();
AddPart("Female_top-1", bones, mats, cis, bone.transform);
AddPart("Female_pants-1", bones, mats, cis, bone.transform);
AddPart("Female_face-1", bones, mats, cis, bone.transform);
AddPart("Female_hair-1", bones, mats, cis, bone.transform);
AddPart("Female_shoes-1", bones, mats, cis, bone.transform);
AddPart("Female_eyes", bones, mats, cis, bone.transform);
SkinnedMeshRenderer smr = bone.GetComponent<SkinnedMeshRenderer>();
smr.sharedMesh = new Mesh();
smr.sharedMesh.CombineMeshes(cis.ToArray(), false, false);
smr.bones = bones.ToArray();
smr.sharedMaterials = mats.ToArray();
}
void AddPart(string partname, List<Transform> bones, List<Material> mats, List<CombineInstance> cis, Transform bone)
{
GameObject go = Resources.Load<GameObject>(partname);
go = (GameObject)Instantiate(go);
SkinnedMeshRenderer smr = go.GetComponent<SkinnedMeshRenderer>();
foreach (Transform child in smr.bones)
{
bones.Add(FindChildByName(child.name));
}
smr.material.mainTexture = tex[mats.Count];
mats.Add(smr.material);
for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++)
{
CombineInstance ci = new CombineInstance();
ci.mesh = smr.sharedMesh;
ci.subMeshIndex = sub;
cis.Add(ci);
}
DestroyImmediate(go);
}
private Transform FindChildByName(string name)
{
foreach (Transform child in boneChildren)
{
if (child.name == name)
{
return child;
}
}
return null;
}