C# 如何在unity中更改游戏对象的颜色?
我有一个名为C# 如何在unity中更改游戏对象的颜色?,c#,unity3d,C#,Unity3d,我有一个名为Scanner的脚本附加到gameobject上,也叫Scanner。扫描仪对象有一个子对象(GFX),它有两种材质,第一种材质称为(静态颜色),第二种材质称为(更改颜色) 扫描程序脚本: public ColorNameScript.ColorName scanColor; public Material staticMat; public MeshRenderer meshRenderer; private void OnValidate() { if (meshRen
Scanner
的脚本附加到gameobject
上,也叫Scanner
。扫描仪对象有一个子对象(GFX),它有两种材质,第一种材质称为(静态颜色),第二种材质称为(更改颜色)
扫描程序脚本:
public ColorNameScript.ColorName scanColor;
public Material staticMat;
public MeshRenderer meshRenderer;
private void OnValidate()
{
if (meshRenderer != null && 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];
}
我的问题是:如上所述使用scanner脚本会在编辑器中导致材质泄漏错误(请参见下面的图片链接),唯一的解决方法是使用meshrender.sharedMaterial
,这样就可以了,但这会将所有其他扫描仪的颜色更改为相同的颜色,我希望能够为每个扫描仪选择不同的颜色。我该怎么做
我已经找到了解决方案,以防有人遇到同样的问题
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!");
}
}
public ColorNameScript.ColorName scanColor;
公共网格渲染器;
私人材料[]扫描材料=新材料[2];
私有void OnValidate()
{
如果(网格渲染器!=null)
{
scannerMaterials[0]=Resources.Load(“静态颜色”);
scannerMaterials[1]=Resources.Load(“更改颜色”);
var tempMat=新材料(扫描材料[1]);
tempMat.color=ColorNameScript.HueColourValue(scanColor);
扫描材料[1]=tempMat;
meshRenderer.sharedMaterials=扫描仪材质;
Log(“颜色已更改”);
}
其他的
{
Log(“缺少文件!”);
}
}
有两个问题:
- 不能在
中使用OnValidate()
,因为 将导致编辑器中的材质泄漏meshRenderer.materials
- 相反,您必须使用
,但这将 为使用相同脚本的所有对象设置相同的颜色meshRenderer.sharedMaterials
扫描仪
您必须创建一个材质数组,并将其设置为
meshRenderer.sharedMaterials
。在编辑器环境中,您需要克隆材质,更改其颜色,并将其指定给渲染器。@shingo我尝试过它,但不起作用=>var newMat=新材质(staticMaterial);