Reem Al-Assaf
Reem Al-Assaf

Reputation: 710

Setting a random color via the diffuse shader

I wrote the following code to see if I can assign a random color to an object. What am I missing that the object never changes color?

using UnityEngine;

public class ColorManager : MonoBehaviour
{
    private void Start()
    {
        Shader shader = Shader.Find("Diffuse");
        Material mat  = new Material(shader) {hideFlags = HideFlags.HideAndDontSave};
        mat.color     = new Color(Random.value, Random.value, Random.value);
    }
}

Upvotes: 1

Views: 319

Answers (1)

derHugo
derHugo

Reputation: 90649

You created a material but you don't assign that material to anything ...

You probably want to assign it to Renderer.material something like

public class ColorManager : MonoBehaviour
{
    // Reference this via the Inspector
    [SerializeField] private Renderer targetRenderer;

    private void Start()
    {
        // As fallback look for a renderer on this object
        if(!targetRenderer) targetRenderer = GetComponent<Renderer>();

        var shader = Shader.Find("Diffuse");
        var mat = new Material(shader) { hideFlags = HideFlags.HideAndDontSave };
        mat.color = new Color(Random.value, Random.value, Random.value);       

        targetRenderer.material = mat;
    }
}

Actually there is no need to create a new material at all. You could simply use the already existing one. Only create a new one as fallback:

public class ColorManager : MonoBehaviour
{
    [SerializeField] private Renderer targetRenderer;

    private void Start()
    {
        if(!targetRenderer) targetRenderer = GetComponent<Renderer>();

        var mat = targetRenderer.material;

        if(!mat)
        {
            Shader shader = Shader.Find("Diffuse");
            mat = new Material(shader) { hideFlags = HideFlags.HideAndDontSave };
        }

        mat.color = new Color(Random.value, Random.value, Random.value);
    }
}

Upvotes: 1

Related Questions