【问题标题】:How to change the colors of gameobjects in unity?如何统一更改游戏对象的颜色?
【发布时间】:2020-10-12 23:15:45
【问题描述】:

我有一个名为Scanner 的脚本附加到gameobject 也称为Scanner。扫描仪对象有一个子对象 (GFX),它有 2 种材质,第一种材质称为(静态颜色),第二种材质称为(更改颜色)。

扫描仪脚本:

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

我的问题是:使用上面的扫描仪脚本会导致编辑器中出现材料泄漏错误(请参阅下面的图片链接),修复它的唯一方法是使用meshRenderer.sharedMaterial,这样就可以了很好,但这会将所有其他扫描仪的颜色更改为相同的颜色,我希望能够为每个扫描仪选择不同的颜色。我该怎么做?

【问题讨论】:

  • 在编辑器环境中,您需要克隆材质,更改其颜色,并将其分配给渲染器。
  • @shingo 我试过了,但没用 => var newMat = new Material(staticMaterial);

标签: c# unity3d


【解决方案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!");
    }
}

有两个问题:

  • 您不能在OnValidate() 中使用meshRenderer.materials,因为它 将导致编辑器中的材料泄漏。
  • 您必须改用meshRenderer.sharedMaterials,但这会 为使用相同脚本的所有对象设置相同的颜色 Scanner

解决办法是: 您必须创建一个材质数组并将meshRenderer.sharedMaterials 设置为它。

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2019-08-09
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多