2015-05-29 65 views
1

我有一個main_mesh有10個子網,我不知道如何可以將這些submeshes的顏色更改爲不同的顏色(例如submesh1將有一個紅色,submesh2將有一個藍色,.. .. 。等等)。有任何建議嗎?unity3d顏色submeshes

UPDATE:

這是我應得我的網狀其中有10個子網:

 SkinnedMeshRenderer smr = gameobject1.GetComponent<SkinnedMeshRenderer>(); 
     Mesh main_mesh = smr.sharedMesh; 

回答

1

既然你已經添加的標籤Unityscript我會假設你想能夠改變腳本內的子網格。

分配作爲參數

第一個解決辦法是有一個公共的參數添加到您的腳本,將網格陣列。然後通過檢查器手動將每個子網格分配給數組。現在您可以訪問每個網格的材質並更改其顏色。

public class MyScript : MonoBehaviour { 
    public Mesh[] submeshes; 

    // Update is called once per frame 
    void Update() { 
     for (int i = 0; submeshes[i]; i++) { 
      // Return the first material of the mesh renderer, use .materials if multiple Material are applied 
      submeshes[i].renderer.material.color = Color.red; 
     } 
    } 
} 

請注意,我用Mesh類型爲我的數組,但你可以直接使用Material,如果你只是想改變顏色。
此外,如果子網具有完全相同的材質,它將更改所有子網格的顏色,而不僅僅是一個。每個網格需要一種材料。 雖然如果您的子網數量動態變化,此解決方案不可行,但此解決方案非常簡單且直接。

使用兒童

而是手動分配每子網,則可以通過動態訪問兒童

public class MyScript : MonoBehaviour { 
    public Mesh myObject; 

    // Update is called once per frame 
    void Update() { 
     Material[] array = myObject.GetComponentsInChildren<Material>(); 
     for (int i = 0; array[i]; i++) { 
      array[i].color = Color.red; 
     } 
    } 
} 

改變顏色該解決方案可以讓你有一個分配給你的子網N材料。 這裏是GetComponentsInChildren


文檔編輯

簡短的回答
如果你想有一個明確的答案你的情況,這取決於分配給您的蒙皮網格渲染器的材料和着色器,因爲他們可以覆蓋或改變你的孩子的材料。如果沒有,下面的代碼應該可以工作。

SkinnedMeshRenderer smr = gameobject1.GetComponent<SkinnedMeshRenderer>(); 
Mesh main_mesh = smr.sharedMesh; 
Mesh[] submeshes = main_mesh.GetComponentsInChildren<Mesh>(); 
for (int i = 0; submeshes[i]; i++) { 
    // If your submesh already have a material, remove the first line below ! 
    submeshes[i].renderer.material = new Material(Shader.Find("Diffuse")); 
    submeshes[i].renderer.material.color = Color.red; 
} 

此解決方案爲每個子網格創建一個新的材質,這是非常殘酷的。
在檢查員中,應該爲每個子網格指定一種材質,然後始終使用具有不同顏色的相同材質。

如果當你想改變一個特定的網格的顏色它不起作用
,該網需要有自己的材料。網格的顏色將取決於這些材質以及它的屬性(着色器,紋理,顏色)。

使用蒙皮網格渲染器,通常使用具有紋理的漫反射材質將顏色應用於一個複雜網格。在某些情況下,這個網格將顏色應用到它的兒童身上。
使用Skinned Mesh Renderer時,通常使用UV紋理。這個特殊的紋理是基於你的3D對象創建的,並用於在其上應用多種顏色(有時候也是兒童)。這裏有一個簡單的例子UV texture,這裏是一個more complex example

請注意,作爲網格渲染器,蒙皮網格渲染器可以具有多種材質,這會使情況更復雜,但原理保持不變。

SkinnedMeshRenderer smr = gameobject1.GetComponent<SkinnedMeshRenderer>(); 
    Mesh main_mesh = smr.sharedMesh; 

與您的代碼,如果main_mesh使用UV紋理,有兩種解決方法

  • 刪除紋理,然後應用色彩到它的孩子
  • 創建該應用顏色作爲你一個具體的UV紋理想。
+1

@shepherd我會相應地修改我的答案=)。 –

+0

非常感謝你:),你可以請檢查我的問題在這裏以及http://stackoverflow.com/questions/30588863/inspector-is-disabled-in-unity? – Tak

2
SkinnedMeshRenderer smr = gameobject1.GetComponent<SkinnedMeshRenderer>(); 
Mesh main_mesh = smr.sharedMesh; 

smr.materials[0].color = Color.red; // Change submesh1 to red color 
smr.materials[1].color = Color.blue; // Change submesh2 to blue color 
... 
smr.materials[n].color = ...   // Change submesh n to whatever color 
+0

非常感謝你,你能不能請點擊這裏查看我的問題,以及http://stackoverflow.com/questions/30588863/inspector-is-disabled-in-unity – Tak