Установка случайного цвета с помощью диффузного шейдера

#unity3d

#unity3d

Вопрос:

Я написал следующий код, чтобы посмотреть, могу ли я присвоить объекту случайный цвет. Чего мне не хватает, чтобы объект никогда не менял цвет?

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

Ответ №1:

Вы создали материал, но вы ничему не назначаете этот материал …

Вероятно, вы хотите назначить его 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);
    }
}