How do I change a sub material with a button click?
So I have most of the code completely working at this point. I am able to change a material with the button click. However, the problem arises when I try to change element 1 instead of element 0.
This is my current code which isn’t working.
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class ColourChangeShield : MonoBehaviour {
[SerializeField]
private Material[] materials;
private Renderer rend;
private int selectedMaterialIndex = 0;
void Start()
{
rend = GetComponent<Renderer>();
rend.enabled = true;
SelectMaterial(materials[selectedMaterialIndex]);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
SelectNextMaterial();
if (Input.GetKeyDown(KeyCode.Alpha2))
SelectPreviousMaterial();
}
public void SelectNextMaterial()
{
selectedMaterialIndex++;
if (selectedMaterialIndex >= materials.Length)
selectedMaterialIndex = 0;
Debug.Log("selectedMaterialIndex: " + selectedMaterialIndex);
SelectMaterial(materials[selectedMaterialIndex]);
}
public void SelectPreviousMaterial()
{
selectedMaterialIndex--;
if (selectedMaterialIndex < 0)
selectedMaterialIndex = materials.Length - 1;
Debug.Log("selectedMaterialIndex: " + selectedMaterialIndex);
SelectMaterial(materials[selectedMaterialIndex]);
}
public void SelectMaterial(Material material)
{
rend.materials[2] = material;
}
}
However, when the void SelectMaterial is structured like this it works.
public void SelectMaterial(Material material)
{
rend.sharedMaterial = material;
}
but only changes element 0 which is not the one I want to change. What can I do to make sure element 1, 2, 3 etc is changed.
Thank you in advance for any help you can provide
Answer by Hellium · Aug 08, 2018 at 11:41 AM
As indicated in the documentation, Renderer.materials
returns a copy of materials array. If you want to change some materials in it, get the value, change an entry and set materials back.
public void SelectMaterial(Material material)
{
Material[] materials = rend.materials ;
materials[2] = material;
rend.materials = materials ;
}
Your answer

Follow this Question
Related Questions
Can I use MaterialPropertyBlock to set properties per material instead of per renderer? 0 Answers
Unable to edit grey ,,locked,, Materials 3 Answers
Slime shader (Fall Guys like material) 0 Answers
How to fix: SpeedTree Leaves and Bark using same material. 1 Answer
Black Material when camera rotate 1 Answer