#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
, и это будет работать просто отлично, но это изменит цвета всех других сканеров на те же самыецвет и я хочу иметь возможность выбирать разные цвета для каждого сканера. Как я могу это сделать ?.
Комментарии:
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
inOnValidate()
, потому что это приведет к утечке материала в редакторе. - Вместо этого вы должны использовать
meshRenderer.sharedMaterials
, но это установит одинаковые цвета для всех объектов, используя один и тот же скриптScanner
.
Решение таково: вы должны создать массив материалов и установить meshRenderer.sharedMaterials
его.