2017-08-17 5 views
0

Ich habe ein Fenster-Tool für ein Projekt erstellt, an dem ich gerade arbeite. Wenn Sie einige Objekte in der Szene auswählen, eine Farbe auswählen und auf Anwenden klicken, sollte sich die Farbe der ausgewählten Objekte ändern. Was es macht. Aber es ändert auch einige andere Objekte, obwohl sie nicht ausgewählt wurden.Wenn ich die Farbe eines Objekts ändern möchte, ändern sich auch einige andere Objekte.

Ich denke das hat damit zu tun, dass ich die Farbe des SharedMaterial auf den Renderer setze, aber wenn ich die normale Material.Color verwenden würde, gibt es mir einen Fehler, dass Material in die Szene und ausleckt dass ich stattdessen SharedMaterial verwenden könnte.

Jetzt ist meine Frage: Wie behebe ich dieses Problem, ohne jedes Mal ein neues Material zu erstellen, wenn ich eine neue Farbe brauche. Weil ich deshalb das Werkzeug gemacht habe (ändere die Farbe eines Objekts, ohne dafür ein neues Material erstellen zu müssen).

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; 
      } 
     } 
    } 
} 
+3

Es ist viel nützlicher, wenn Sie den Code hier, anstatt einen Screenshot posten. Haben Sie dies durch den Debugger ausgeführt und gesehen, ob die Objekte in der 'Selection.gameObjects'-Sammlung erwartungsgemäß sind? – ainwood

+0

Welcher Rahmen ist das? Dies ist kein Standard C#, ist es Unity? – nvoigt

Antwort

0

Sie können das nicht in Unity tun. Sie müssen die Farbe des Materials ändern. Wenn dieses Material auf andere Objekte angewendet wird, werden diese ebenfalls geändert. Sie müssen also mehrere Materialien für verschiedenfarbige Objekte erstellen.

+0

Sie können also das RGB des Materials, das das Objekt hat, nicht bearbeiten? –

+0

Sie können das RGB des Materials ändern, das unabhängig vom Objekt ist. Wenn mehrere Objekte dasselbe Material haben, wirkt sich das Ändern der Materialfarbe auf alle Objekte aus. – ZayedUpal

+0

Sprichst du, Materialien werden nicht für jedes Objekt/jede Komponente kopiert, an die sie angehängt sind? ... – George

3

statt renderer.sharedMaterial sollten Sie renderer.material verwenden.

renderer.sharedMaterial wird die Änderung für alle Objekte vornehmen, die dieses Material verwenden. Wenn Sie nur renderer.material ändern, erstellt Unity eine Instanz (interne Laufzeitkopie) dieses Materials und verwendet diese.

Hinweis: Dies wird jedes Material diskontinuierlich brechen dieses modifizierte Objekt ist Teil von, da es intern ein anderes Material ist.

Verwandte Themen