Как изменить цвета игровых объектов в Unity?

#c# #unity3d

#c# #unity3d

Вопрос:

У меня есть скрипт, который называется Scanner прикрепленным к gameobject также вызываемому Scanner . У объекта scanner есть дочерний объект (GFX), который имеет 2 материала, первый материал называется (статические цвета), а второй материал называется (изменение цвета).

Скрипт сканера:

 public ColorNameScript.ColorName scanColor;
public Material staticMat;
public MeshRenderer meshRenderer;

private void OnValidate()
{
    if (meshRenderer != null amp;amp; staticMat != null)
    {
        MaterialPropertyBlock block = new MaterialPropertyBlock();
        block.SetColor("_Color", ColorNameScript.HueColourValue(scanColor));

        meshRenderer.materials[1].color = block.GetColor("_Color");
        Debug.Log("Color has changed");
    }
    else
    {
        Debug.Log("Missing files!");
    }
}
  

Это ColorNameScript всего лишь простой скрипт, который я нашел в Интернете, который помогает мне устанавливать цвет с помощью перечислений.

 public enum ColorName
{
    Lime,
    Green,
    Aqua,
    Blue,
    Navy,
    Purple,
    Pink,
    Red,
    Orange,
    Yellow
}

private static Hashtable hueColourValues = new Hashtable{
     { ColorName.Lime,     new Color32( 166 , 254 , 0, 255 ) },
     { ColorName.Green,     new Color32( 0 , 254 , 111, 255 ) },
     { ColorName.Aqua,     new Color32( 0 , 201 , 254, 255) },
     { ColorName.Blue,     new Color32( 0 , 122 , 254, 255 ) },
     { ColorName.Navy,     new Color32( 60 , 0 , 254, 255 ) },
     { ColorName.Purple, new Color32( 143 , 0 , 254, 255 ) },
     { ColorName.Pink,     new Color32( 232 , 0 , 254, 255 ) },
     { ColorName.Red,     new Color32( 254 , 9 , 0, 255 ) },
     { ColorName.Orange, new Color32( 254 , 161 , 0, 255 ) },
     { ColorName.Yellow, new Color32( 254 , 224 , 0, 255 ) },
};

public static Color32 HueColourValue(ColorName color)
{
    return (Color32)hueColourValues[color];
}
  

Моя проблема в том, что использование скрипта сканера, описанного Выше, приводит к ошибкам утечки материалов в редакторе (см. Ссылки на Изображения ниже), и единственный способ исправить это — использовать meshRenderer.sharedMaterial , и это будет работать просто отлично, но это изменит цвета всех других сканеров на те же самыецвет и я хочу иметь возможность выбирать разные цвета для каждого сканера. Как я могу это сделать ?.

Изображение ошибки утечки материала

Изображение материалов GFX

Комментарии:

1. В среде редактора вам нужно клонировать материал, изменить его цвет и назначить его программе визуализации.

2. @shingo я пробовал, но это не сработало => var newMat = новый материал (staticMaterial);

Ответ №1:

Я нашел решение на случай, если у кого-то возникнет такая же проблема..

 public ColorNameScript.ColorName scanColor;
public MeshRenderer meshRenderer;

private Material[] scannerMaterials = new Material[2];

private void OnValidate()
{
    if (meshRenderer != null)
    {
        scannerMaterials[0] = Resources.Load<Material>("Static Color");
        scannerMaterials[1] = Resources.Load<Material>("Change Color");

        var tempMat = new Material(scannerMaterials[1]);
        tempMat.color = ColorNameScript.HueColourValue(scanColor);

        scannerMaterials[1] = tempMat;

        meshRenderer.sharedMaterials = scannerMaterials;
        Debug.Log("Color has changed");
    }
    else
    {
        Debug.Log("Missing files!");
    }
}
  

Было 2 проблемы:

  • Вы не можете использовать meshRenderer.materials in OnValidate() , потому что это приведет к утечке материала в редакторе.
  • Вместо этого вы должны использовать meshRenderer.sharedMaterials , но это установит одинаковые цвета для всех объектов, используя один и тот же скрипт Scanner .

Решение таково: вы должны создать массив материалов и установить meshRenderer.sharedMaterials его.