public static void Combine(MeshRenderer[] meshRenders, MeshFilter[] meshFilters, out Mesh mesh, out Material[] materials) { var meshInstanceList = new List <SkinMeshCombineUtility.MeshInstance>(); var materialList = new List <Material>(); // validate arguments if (meshFilters == null) { throw new ArgumentNullException("meshFilters"); } if (meshRenders == null) { throw new ArgumentNullException("meshRenders"); } if (meshRenders.Length != meshFilters.Length) { throw new ArgumentException("'meshRenders' & 'meshFilters' must be the same length."); } // build a list of MeshInstance types for (var index = 0; index < meshRenders.Length; index++) { var meshRenderer = meshRenders[index]; // Getting one by one var meshFilter = meshFilters[index]; // Making changes to the Skinned Renderer var instance = new SkinMeshCombineUtility.MeshInstance { mesh = meshFilter.sharedMesh }; // Getting All Materials for (var i = 0; i < meshRenderer.sharedMaterials.Length; i++) { materialList.Add(meshRenderer.sharedMaterials[i]); } if (meshRenderer != null && instance.mesh != null) { // Getting subMesh for (var i = 0; i < meshFilter.sharedMesh.subMeshCount; i++) { instance.subMeshIndex = i; meshInstanceList.Add(instance); } } } // combine meshes var newMesh = SkinMeshCombineUtility.Combine(meshInstanceList.ToArray()); newMesh.RecalculateNormals(); newMesh.RecalculateBounds(); mesh = newMesh; // Setting Materials materials = materialList.ToArray(); }
// Use this for initialization void Start() { //Getting all Skinned Renderer from Children Component[] allsmr = GetComponentsInChildren(typeof(SkinnedMeshRenderer)); Matrix4x4 myTransform = transform.worldToLocalMatrix; //The hash with the all bones references: it will be used for set up the BoneWeight Indexes Hashtable boneHash =new Hashtable(); /* If you want make a counter in order to get the total of Vertices and Bones do it here ... */ //The Sum of All Child Bones Transform[] totalBones = new Transform[BONE_NUMBER];//Total of Bones for my Example //The Sum of the BindPoses Matrix4x4[] totalBindPoses = new Matrix4x4[BONE_NUMBER];//Total of BindPoses //The Sum of BoneWeights BoneWeight[] totalBoneWeight = new BoneWeight[VERTEX_NUMBER];//total of Vertices for my Example int offset=0; int b_offset=0; Transform[] usedBones= new Transform[totalBones.Length]; ArrayList myInstances = new ArrayList(); //Setting my Arrays for copies ArrayList myMaterials=new ArrayList(); for(int i=0;i<allsmr.Length;i++) { //Getting one by one SkinnedMeshRenderer smrenderer = (SkinnedMeshRenderer)allsmr[i]; //Making changes to the Skinned Renderer SkinMeshCombineUtility.MeshInstance instance = new SkinMeshCombineUtility.MeshInstance (); //Setting the Mesh for the instance instance.mesh = smrenderer.sharedMesh; //Getting All Materials for(int t=0;t<smrenderer.sharedMaterials.Length;t++) { myMaterials.Add(smrenderer.sharedMaterials[t]); } if (smrenderer != null && smrenderer.enabled && instance.mesh != null) { instance.transform = myTransform * smrenderer.transform.localToWorldMatrix; //Material == null smrenderer.sharedMaterials =new Material[1]; //Getting subMesh for(int t=0;t<smrenderer.sharedMesh.subMeshCount;t++) { instance.subMeshIndex = t; myInstances.Add(instance); } //Copying Bones for(int x=0;x<smrenderer.bones.Length;x++) { bool flag = false; for(int j=0;j<totalBones.Length;j++) { if(usedBones[j]!=null) //If the bone was already inserted if((smrenderer.bones[x]==usedBones[j])) { flag = true; break; } } //If Bone is New ... if(!flag) { Debug.Log("Inserted bone:"+smrenderer.bones[x].name); for(int f=0;f<totalBones.Length;f++) { //Insert bone at the firs free position if(usedBones[f]==null) { usedBones[f] = smrenderer.bones[x]; break; } } //inserting bones in totalBones totalBones[offset]=smrenderer.bones[x]; //Reference HashTable boneHash.Add(smrenderer.bones[x].name,offset); //Recalculating BindPoses //totalBindPoses[offset] = smrenderer.sharedMesh.bindposes[x] ; totalBindPoses[offset] = smrenderer.bones[x].worldToLocalMatrix * transform.localToWorldMatrix ; offset++; } } //RecalculateBoneWeights for(int x=0;x<smrenderer.sharedMesh.boneWeights.Length ;x++) { //Just Copying and changing the Bones Indexes !! totalBoneWeight[b_offset] = recalculateIndexes(smrenderer.sharedMesh.boneWeights[x],boneHash,smrenderer.bones); b_offset++; } //Disabling current SkinnedMeshRenderer ((SkinnedMeshRenderer)allsmr[i]).enabled = false; } } SkinMeshCombineUtility.MeshInstance[] instances = (SkinMeshCombineUtility.MeshInstance[])myInstances.ToArray(typeof(SkinMeshCombineUtility.MeshInstance)); // Make sure we have a SkinnedMeshRenderer if (GetComponent(typeof(SkinnedMeshRenderer)) == null) { gameObject.AddComponent(typeof(SkinnedMeshRenderer)); } //Setting Skinned Renderer SkinnedMeshRenderer objRenderer = (SkinnedMeshRenderer)GetComponent(typeof(SkinnedMeshRenderer)); //Setting Mesh objRenderer.sharedMesh = SkinMeshCombineUtility.Combine(instances); objRenderer.castShadows = castShadows; objRenderer.receiveShadows = receiveShadows; //The Sum of All Child Bones List<Transform> listTotalBones = new List<Transform>(); //new Transform[BONE_NUMBER];//Total of Bones for my Example //The Sum of the BindPoses List<Matrix4x4> listTotalBindPoses = new List<Matrix4x4>(); //new Matrix4x4[BONE_NUMBER];//Total of BindPoses //The Sum of BoneWeights List<BoneWeight> listTotalBoneWeight = new List<BoneWeight>(); //new BoneWeight[VERTEX_NUMBER];//total of Vertices for my Example for(int i = 0; i < totalBones.Length; ++i) { if(null == totalBones[i]) break; listTotalBones.Add(totalBones[i]); } for(int i = 0; i < b_offset; ++i) { if(null == totalBoneWeight[i]) break; listTotalBoneWeight.Add(totalBoneWeight[i]); } for(int i = 0; i < offset; ++i) { if(null == totalBindPoses[i]) break; listTotalBindPoses.Add(totalBindPoses[i]); } //Setting Bindposes objRenderer.sharedMesh.bindposes = listTotalBindPoses.ToArray(); //Setting BoneWeights objRenderer.sharedMesh.boneWeights = listTotalBoneWeight.ToArray(); //Setting bones objRenderer.bones = listTotalBones.ToArray(); //Setting Materials objRenderer.sharedMaterials = (Material[])myMaterials.ToArray(typeof(Material)); objRenderer.sharedMesh.RecalculateNormals(); objRenderer.sharedMesh.RecalculateBounds(); //Enable Mesh objRenderer.enabled = true; Debug.Log("############################################"); Debug.Log("M Materials "+myMaterials.Count); Debug.Log("bindPoses "+objRenderer.sharedMesh.bindposes.Length); Debug.Log("boneWeights "+objRenderer.sharedMesh.boneWeights.Length); Debug.Log("Bones "+objRenderer.bones.Length); Debug.Log("Vertices "+objRenderer.sharedMesh.vertices.Length); }