private static void _Combine_NPT(CombineInfo combineInfo) { List <Mesh> meshList = new List <Mesh>(); try { CharacterAsset item = null; int i, j, k, count, count1, count2; List <CombineInstance> combineInstances = new List <CombineInstance>(); List <Transform> bones = new List <Transform>(); List <Material> materials = new List <Material>(); Transform[] transforms = combineInfo.root.GetComponentsInChildren <Transform>(); SkinnedMeshRenderer smr = null; CombineInstance ci; string[] strs = null; string str = null; Transform transform; count2 = transforms.Length; count = combineInfo.items.Count; for (i = 0; i < count; i++) { item = combineInfo.items[i]; smr = item.GetSkinnedMeshRenderer(); if (smr == null) { return; } materials.AddRange(smr.materials); Mesh mesh = Mesh.Instantiate(smr.sharedMesh) as Mesh; for (j = 0, count1 = smr.sharedMesh.subMeshCount; j < count1; j++) { ci = new CombineInstance(); ci.mesh = mesh; ci.subMeshIndex = j; combineInstances.Add(ci); } strs = item.GetBoneNames(); for (j = 0, count1 = strs.Length; j < count1; j++) { str = strs[j]; for (k = 0; k < count2; k++) { transform = transforms[k]; if (transform.name != str) { continue; } bones.Add(transform); break; } } meshList.Add(mesh); Object.Destroy(smr.gameObject); } TempLoad_NPT tl = new TempLoad_NPT(); tl.combineInstances = combineInstances; tl.bones = bones; tl.meshList = meshList; tl.materials = materials; tl.endCombine = combineInfo.endCombine; tl.endParam = combineInfo.endParam; tl.root = combineInfo.root; tl.plus = combineInfo.plus; tl.sub = combineInfo.sub; tl.light = combineInfo.light; ProcessCombine(tl); } catch (System.Exception e) { if (combineInfo != null && combineInfo.endCombine != null) { combineInfo.endCombine(null, -1, -1, combineInfo.endParam); } Debug.LogError("combine error->" + e.ToString() + "\r\n" + e.StackTrace); } }
private static void ProcessCombine(TempLoad_NPT tl) { lock (lockCombine) { try { SkinnedMeshRenderer r = tl.root.GetComponent <SkinnedMeshRenderer>(); r.sharedMesh = new Mesh(); r.sharedMesh.CombineMeshes(tl.combineInstances.ToArray(), false, false); r.bones = tl.bones.ToArray(); r.materials = tl.materials.ToArray(); CombineObj co = new CombineObj(); co.obj = tl.root; co.combine = true; if (!combinedDic2.ContainsKey(tl.plus)) { Dictionary <int, List <CombineObj> > dic = new Dictionary <int, List <CombineObj> >(); List <CombineObj> list = new List <CombineObj>(); CombineObj rootObj = new CombineObj(); rootObj.combine = true; rootObj.obj = (GameObject)Object.Instantiate(co.obj); rootObj.obj.SetActive(false); list.Add(rootObj); co.combine = false; list.Add(co); dic.Add(tl.sub, list); combinedDic2.Add(tl.plus, dic); } else { Dictionary <int, List <CombineObj> > dic = combinedDic2[tl.plus]; if (dic.ContainsKey(tl.sub)) { dic[tl.sub].Add(co); } else { List <CombineObj> list = new List <CombineObj>(); CombineObj rootObj = new CombineObj(); rootObj.combine = true; rootObj.obj = (GameObject)Object.Instantiate(co.obj); rootObj.obj.SetActive(false); list.Add(rootObj); co.combine = false; list.Add(co); dic.Add(tl.sub, list); } } //add first, then avoid to del if (tl.endCombine != null) { tl.endCombine(tl.root, tl.plus, tl.sub, tl.endParam); } } catch (System.Exception e) { if (tl.endCombine != null) { tl.endCombine(null, tl.plus, tl.sub, tl.endParam); } Debug.LogError("process combine error->" + e.ToString()); } } }