I use the following code to switch an objects material via a button click in-game. I am a bit stuck when it comes to changing materials on an object with more than one material, as this is only changing the first material.
public class MaterialSwitch : MonoBehaviour
[SerializeField] private GameObject objectToChange;
public void SwitchMaterial (Material mat)
objectToChange.GetComponent<Renderer>().material = mat;
I feel like the solution is pretty simple but I am quite new to progamming!
If someone can help me out it would be very much appreciated!
renderer.material is really just a shortcut for
renderer.materials. To change them all, just use a loop.
See documentation https://docs.unity3d.com/ScriptReference/Renderer.html
Renderer.material Returns the first instantiated Material assigned to the renderer.
Modifying material will change the material for this object only.
If the material is used by any other renderers, this will clone the shared material and start using it from now on.
This function automatically instantiates the materials and makes them unique to this renderer. It is your responsibility to destroy the materials when the game object is being destroyed.
Resources.UnloadUnusedAssets also destroys the materials but it is usually only called when loading a new level.
// Change renderer's material each changeInterval
// seconds from the material array defined in the inspector.
public class ExampleClass : MonoBehaviour
public Material materials;
public float changeInterval = 0.33F;
public Renderer rend;
rend = GetComponent<Renderer>();
rend.enabled = true;
if (materials.Length == 0)
// we want this material index now
int index = Mathf.FloorToInt(Time.time / changeInterval);
// take a modulo with materials count so that animation repeats
index = index % materials.Length;
// assign it to the renderer
rend.sharedMaterial = materials[index];
you can get idea from the above code how to change materials in the array