How does assigning materials to MeshRenderer.sharedMaterials work?

I am procedurally generating a cube mesh in the editor. Each of its faces can be enabled or disabled. Each enabled face is created as a separate submesh and materials are assigned to MeshRenderer.sharedMaterials accordingly. However, in MeshRenderer’s inspector, materials does not reflect that assignment, whatever I manually assign does not change. This is the code I use:

void updateMaterials(int meshcount) {        
        if (meshrenderer.sharedMaterials.Length != meshcount) {
            meshrenderer.sharedMaterials = new Material[meshcount];
        }
        int j = 0;
        for (int i = 0; i < faces.Length; i++) { // faces: bool[6], true when face exists
            if (faces*) {*

meshrenderer.sharedMaterials[j] = materials*;*
Debug.Log(j.ToString() + ": " + materials*.ToString());*
// Output:
// 0: Floor (UnityEngine.Material)
// 1: Wall-bricks (UnityEngine.Material)
j++;
}
}
}
Does anybody know what I am doing wrong here? Thanks.

The reason this is not changing is because renderer.materials and renderer.sharedMaterials return a copy of the materials, even when assigning. That means the following line

meshrenderer.sharedMaterials[j] = materials*;*

is the same as
Material[]sharedMaterials=meshrenderer.sharedMaterials;
sharedMaterials[j] = materials*;*
so you never assign the materials back to the renderer. You want to use something like the following
void updateMaterials(int meshcount)
if(meshrenderer.sharedMaterials.Length!=meshcount) {
meshrenderer.sharedMaterials=new Material[meshcount];
}
Material[] sharedMaterials=meshrenderer.sharedMaterials;
int j=0;
for(int i=0; i<faces.Length; i++) { // faces: bool[6], true when face exists
if(faces*) {*
sharedMaterials[j]=materials*;*
Debug.Log(j.ToString()+": "+materials*.ToString());*
// Output:
// 0: Floor (UnityEngine.Material)
// 1: Wall-bricks (UnityEngine.Material)
j++;
}
}
meshrenderer.sharedMaterials=materials;
}
_*http://docs.unity3d.com/ScriptReference/Renderer-sharedMaterials.html*_