当我想要改变对象的颜色时,其他一些对象也会改变

时间:2017-08-17 09:05:05

标签: c# unity3d

我为我正在进行的项目制作了一个窗口工具。当您在场景中选择一些对象并选择一种颜色并点击“应用”时,它应该更改您选择的对象的颜色。它做的。但它也会改变其他一些对象,即使它们没有被选中。

我认为这与我在渲染器上设置SharedMaterial的颜色有关,但如果我使用普通的Material.Color,它会给我一个错误,即它将材料泄漏到场景中我可能会使用SharedMaterial。

现在我的问题是:如何在不需要每次需要新颜色时创建新材料的情况下解决此问题。因为这就是我制作工具的原因(更改对象的颜色而不必为其创建新材料)。

private void OnGUI()
{
    newColor = EditorGUILayout.ColorField("Color", newColor);
    EditorGUILayout.Space();

    if (GUILayout.Button("Apply color"))
    {
        foreach (GameObject element in Selection.gameObjects)
        {
            Renderer renderer = element.GetComponent<Renderer>();

            if (renderer != null)
            {
                renderer.sharedMaterial.color = newColor;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

而不是使用renderer.sharedMaterial,您应该使用renderer.material。

renderer.sharedMaterial将对使用该材质的所有对象进行更改。如果只更改renderer.material,Unity将创建该材质的实例(内部运行时副本)并使用它。

注意:这将破坏任何材料批处理这个修改过的对象是内部的一部分,因为它是一种不同的材料。

答案 1 :(得分:0)

你不能在Unity中做到这一点。 您必须更改材料的颜色。如果该材质应用于其他对象,那么这些也将被更改。因此,您需要为不同颜色的对象创建多种材质。