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

Also if someone knows how the four material properties relate to each other, material, materials, sharedMaterial and sharedMaterials I'd love to know. For example if I wanted 1 shared material and 2 instanced materials how would I set that up?

Also I just realized I never actually tried it with more than one material, I don't know if that would make a difference.


Some properties in unity don't work as expected. Lots of Getters actually return a copy of the datastructure, and not a pointer to it. Try creating a Material[] array yourself, setting all of its properties (like you did) and then run

meshRenderer.materials = myMaterialArray;