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