public GameObject Generate(GameObject root) { float startTime = Time.realtimeSinceStartup; List <CombineInstance> combineInstances = new List <CombineInstance>(); List <Material> materials = new List <Material>(); List <Transform> bones = new List <Transform>(); Transform[] transforms = root.GetComponentsInChildren <Transform>(); foreach (KeyValuePair <string, CharacterElement> kvp in curConfiguration) { CharacterElement element = kvp.Value; SkinnedMeshRenderer smr = element.GetSkinnedMeshRenderer(); materials.AddRange(smr.materials); for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++) { CombineInstance ci = new CombineInstance(); ci.mesh = smr.sharedMesh; ci.subMeshIndex = sub; //Debug.LogWarning(smr.sharedMesh.bindposes.Length); combineInstances.Add(ci); } int boneCount = element.GetBoneNames().Length; foreach (string bone in element.GetBoneNames()) { foreach (Transform transform in transforms) { if (transform.name != bone) { continue; } bones.Add(transform); break; } } Object.Destroy(smr.gameObject); } SkinnedMeshRenderer r = root.GetComponent <SkinnedMeshRenderer>(); r.sharedMesh = new Mesh(); r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false); r.bones = bones.ToArray(); int bones_count = r.bones.Length; int bindposes_count = r.sharedMesh.bindposes.Length; //Debug.LogWarning("bones.Count = "+bones_count + " bindposes.Count = "+ bindposes_count + " totalCount ="+totalCount ); r.materials = materials.ToArray(); Debug.Log("Generating character took: " + (Time.realtimeSinceStartup - startTime) * 1000 + " ms"); return(root); }