MeshRenderer.materials property

Hey guys I’m probably doing something really silly, but I’ve been trying to generate a mesh with multiple materials through script. Everything else works great, but I ran into some strange behavior with MeshRenderer.materials

Basically if I set the material (singular) property to an existing material everything works fine, but if I try to set it through materials it gets ignored and I’m not sure why.

GameObject gameObj = World.Instance.GetObject();
Material mat = World.Instance.GetMaterial();
MeshRenderer meshRenderer = gameObj.GetComponent<MeshRenderer>();

// Works fine
//meshRenderer.material = mat;

// Does nothing
meshRenderer.materials = new Material[1];
meshRenderer.materials[0] = mat;

// However this gives me the color component of my material
meshRenderer.materials[0].CopyPropertiesFromMaterial(mat);

Also if someone knows how the four material properties relate to each other, material, materials, sharedMaterial and sharedMaterials I’d love to know.

Thanks.

First, welcome to the forum! :smile:

Apparently you need to assign the entire array all at once. I don’t know if this is intended behavior or not, but it seems like a bug to me. I just reported it. For the time being, this will work:

meshRenderer.materials = new Material[] {null, mat, null, mat};

I think the documentation spells it out clearly enough; what don’t you understand, exactly? I never find myself having a need for “materials”, I always use the shared variant, because it doesn’t create a new instance, it is useful for batching, and it works in the Editor.