我为我正在进行的项目制作了一个窗口工具。当您在场景中选择一些对象并选择一种颜色并点击“应用”时,它应该更改您选择的对象的颜色。它做的。但它也会改变其他一些对象,即使它们没有被选中。
我认为这与我在渲染器上设置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;
}
}
}
}
答案 0 :(得分:3)
而不是使用renderer.sharedMaterial,您应该使用renderer.material。
renderer.sharedMaterial将对使用该材质的所有对象进行更改。如果只更改renderer.material,Unity将创建该材质的实例(内部运行时副本)并使用它。
注意:这将破坏任何材料批处理这个修改过的对象是内部的一部分,因为它是一种不同的材料。
答案 1 :(得分:0)
你不能在Unity中做到这一点。 您必须更改材料的颜色。如果该材质应用于其他对象,那么这些也将被更改。因此,您需要为不同颜色的对象创建多种材质。