Search Unity

Combine objects Instancing Materials issue

Discussion in 'Scripting' started by JHibbins, Oct 31, 2014.

  1. JHibbins

    JHibbins

    Joined:
    Apr 25, 2014
    Posts:
    9
    Hi, the code bellow works perfectly, however the materials become instanced not shared, am I just being silly, i can't see why or how to solve it:

    P.S Nice piece of code, however I plan to tidy it and optimise so be careful

    Code (CSharp):
    1. private void combineMeshes(GameObject _GameObject){
    2.         MeshFilter[] meshFilters = _GameObject.GetComponentsInChildren<MeshFilter>();
    3.         CombineInstance[] combine = new CombineInstance[meshFilters.Length];
    4.         int i = 0;
    5.         ArrayList materials = new ArrayList();
    6.         ArrayList combineInstanceArrays = new ArrayList ();
    7.         Matrix4x4 myTransform = _GameObject.transform.worldToLocalMatrix;
    8.         while (i < meshFilters.Length) {
    9.             if(meshFilters[i].renderer.enabled){
    10.                 MeshRenderer MFmeshRenderer = meshFilters[i].GetComponent<MeshRenderer> ();
    11.                
    12.                 for (int s = 0; s < MFmeshRenderer.materials.Length; s++) {
    13.                     int materialArrayIndex = Contains (materials, MFmeshRenderer.sharedMaterials [s].name);
    14.                     if (materialArrayIndex == -1) {
    15.                         materials.Add (MFmeshRenderer.sharedMaterials [s]);
    16.                         materialArrayIndex = materials.Count - 1;
    17.                     }
    18.                     combineInstanceArrays.Add (new ArrayList ());
    19.    
    20.                     CombineInstance combineInstance = new CombineInstance ();
    21.                     combineInstance.transform = myTransform * MFmeshRenderer.transform.localToWorldMatrix;
    22.                     combineInstance.subMeshIndex = s;
    23.                     combineInstance.mesh = meshFilters[i].sharedMesh;
    24.                     (combineInstanceArrays [materialArrayIndex] as ArrayList).Add (combineInstance);  
    25.                 }  
    26.             }
    27.             // if(meshFilters[i].gameObject.name=="Wall_E" || meshFilters[i].gameObject.name=="Wall_S" || meshFilters[i].gameObject.name=="Wall_S" || meshFilters[i].gameObject.name=="Wall_S"){
    28.             meshFilters[i].gameObject.active = false;
    29.             //}
    30.             i++;
    31.         }
    32.        
    33.         _GameObject.AddComponent("MeshFilter");
    34.         MeshFilter meshFilterCombine = _GameObject.GetComponent<MeshFilter>();
    35.         Mesh[] meshes = new Mesh[materials.Count];
    36.         CombineInstance[] combineInstances = new CombineInstance[materials.Count];
    37.         for (int m = 0; m < materials.Count; m++) {
    38.             CombineInstance[] combineInstanceArray = (combineInstanceArrays [m] as ArrayList).ToArray (typeof(CombineInstance)) as CombineInstance[];
    39.             meshes [m] = new Mesh ();
    40.             meshes [m].CombineMeshes (combineInstanceArray, true, true);                  
    41.             combineInstances [m] = new CombineInstance ();
    42.             combineInstances [m].mesh = meshes [m];
    43.             combineInstances [m].subMeshIndex = 0;
    44.         }
    45.         // Combine into one
    46.         meshFilterCombine.sharedMesh = new Mesh ();
    47.         meshFilterCombine.sharedMesh.CombineMeshes (combineInstances, false, false);
    48.         foreach( Mesh mesh in meshes )
    49.         {
    50.             mesh.Clear();
    51.             DestroyImmediate(mesh);
    52.         }
    53.         if(meshFilterCombine.sharedMesh.vertexCount>0){
    54.             // Get / Create mesh renderer
    55.             MeshRenderer meshRendererCombine = _GameObject.GetComponent<MeshRenderer> ();
    56.             if (!meshRendererCombine){
    57.                 meshRendererCombine = _GameObject.AddComponent<MeshRenderer> ();  
    58.             }
    59.             meshRendererCombine.castShadows=false;
    60.             meshRendererCombine.receiveShadows=false;
    61.             //                // Assign materials
    62.             Material[] materialsArray = materials.ToArray (typeof(Material)) as Material[];
    63.             meshRendererCombine.materials = materialsArray;
    64.  
    65.             //                // _GameObjecttransform.gameObject.active = true;
    66.         }else{
    67.             DestroyImmediate(_GameObject);
    68.         }
    69.     }