2017-08-17 61 views
0

我爲我正在開發的一個項目製作了一個窗口工具。當您選擇場景中的某些對象並選取一種顏色並點擊應用時,它應該更改所選對象的顏色。它做什麼。但它也會改變其他一些對象,即使它們沒有被選中。當我想改變一個物體的顏色時,其他一些物體也改變了

我認爲這與我在渲染器上設置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; 
      } 
     } 
    } 
} 
+3

如果你在這裏發佈代碼,而不是屏幕截圖,它會更有用。你是否已經通過調試器來運行它,並且看看'Selection.gameObjects'集合中的對象是否是你期望的對象? – ainwood

+0

那是什麼框架?這不是標準的C#,是Unity嗎? – nvoigt

回答

0

你不能在Unity中做到這一點。 您必須更改材質的顏色。如果這種材料被應用於其他物體,那麼這些材料也將被改變。所以,您需要爲不同顏色的對象創建多個材質。

+0

所以你不能編輯對象所具有的材質的RGB值? –

+0

您可以更改與對象無關的材質的RGB。因此,如果多個對象具有相同的材質,更改材質顏色將影響所有對象。 – ZayedUpal

+0

是不是說每個對象/組件都沒有複製材料? ......確切地說, – George

3

而不是使用renderer.sharedMaterial你應該使用renderer.material。

renderer.sharedMaterial將對使用該材質的所有對象進行更改。如果您只更改renderer.material,Unity將創建該材質的實例(內部運行時副本)並使用該實例。

注意:這會破壞這個修改對象的一部分,因爲它在內部是不同的材質。

相關問題