コード例 #1
0
        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();
        }
コード例 #2
0
    // 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);
    }