2015-05-29 36 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