【问题标题】:When I want to change the color of an object, some other objects change too当我想改变一个对象的颜色时,其他一些对象也会改变
【发布时间】:2017-08-17 09:05:05
【问题描述】:

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

我认为这与我在渲染器上设置 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;
            }
        }
    }
}

【问题讨论】:

  • 在这里贴出代码比截图更有用。你有没有通过调试器运行它,并查看Selection.gameObjects 集合中的对象是否是你所期望的?
  • 那是什么框架?这不是标准的 C#,是 Unity 吗?

标签: c# unity3d


【解决方案1】:

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

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

注意:这将破坏此修改对象所属的任何材料批处理,因为在内部它是不同的材料。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 所以你不能编辑物体的材质的RGB?
    • 可以改变材质的RGB,与物体无关。因此,如果多个对象具有相同的材质,则更改材质颜色会影响所有对象。
    • 你是说没有为它们附加的每个对象/组件复制材料吗? ...
    • 没错。出于测试目的,只需在 Unity 中获取 2 个 3D 对象。创建新材料。将该材质分配给两个对象。现在,编辑材质,两个对象都将被更改。如果您只为一个对象更改它,它是相同的,因为它们指的是相同的材料。
    • 你可以按照其他答案所说的去做(来自 GameDevBryant 的那个)
    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2023-02-26
    • 1970-01-01
    • 2013-06-27
    • 2015-09-22
    相关资源
    最近更新 更多