首页 > 解决方案 > 通过漫反射着色器设置随机颜色

问题描述

我编写了以下代码来查看是否可以为对象分配随机颜色。我错过了什么对象永远不会改变颜色?

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);
    }
}

标签: unity3d

解决方案


您创建了一种材料,但您没有将该材料分配给任何东西......

你可能想把它分配给类似的Renderer.material东西

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;
    }
}

实际上根本不需要创建新材料。您可以简单地使用已经存在的。只创建一个新的作为后备:

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);
    }
}

推荐阅读