如何更改Unity中材质的颜色?

时间:2013-12-16 20:11:37

标签: unity3d unityscript

我正在开发一个使用虚拟按钮的Vuforia应用程序。我使用了虚拟按钮的例子,我在脚本上找到了这个部分

public void OnButtonPressed(VirtualButtonBehaviour vb)
{
    Debug.Log("OnButtonPressed");

    if (!IsValid())
    {
        return;
    }

    // Add the material corresponding to this virtual button
    // to the active material list:
    switch (vb.VirtualButtonName)
    {
        case "red":
            mActiveMaterials.Add(m_TeapotMaterials[0]);
            break;

        case "blue":
            mActiveMaterials.Add(m_TeapotMaterials[1]);
            break;

        case "yellow":
            mActiveMaterials.Add(m_TeapotMaterials[2]);
            break;

        case "green":
            mActiveMaterials.Add(m_TeapotMaterials[3]);
            break;
    }

    // Apply the new material:
    if (mActiveMaterials.Count > 0)
        mTeapot.renderer.material = mActiveMaterials[mActiveMaterials.Count - 1];
}

正如所见,我只需要在每种情况下添加代码来“做某事”。嗯,我想要做的是改变一个对象的颜色。 该对象是从Maya导出的fbx并具有动画。我想改变对象内部网格的颜色。 该对象称为“路径”,其内部有3个网格(polySurface1_MeshPart0,.1,。。2),每个网格都有不同的材质对应网格的不同部分,它们是没有纹理的材质,只是一个纯色的着色器漫反射。 我需要在对象的特定网格中更改其中一种材质的颜色:)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

来自Unity3D文档:http://docs.unity3d.com/Documentation/ScriptReference/Material-color.html

您需要在运行时通过GameObject.Find()找到GameObjects,或者将它们分配给您的脚本公共成员。每个网格应该可以作为GameObject检索。一旦你引用了有问题的GameObject,你就应该能够访问它的材料:

myGameObject.renderer.material.color = Color.Red;

使用提供的代码的示例是:

switch (vb.VirtualButtonName)
{
    case "red":
        mActiveMaterials.Add(m_TeapotMaterials[0]);
        GameObject go = GameObject.Find("The Name Of The Object You Are Looking For");
        go.renderer.material.color = Color.Red;
        break;
}

答案 1 :(得分:0)

首先,gameObject.renderer很久以前已被折旧,你应该明确地使用GetComponent()。

其次,您正在添加mActiveMaterials(我假设是List或等效的),但您似乎没有清除该列表,代码可能正常工作,您正在以这种方式创建严重的内存泄漏(除非你在别处清楚列表)

现在,对于每个网格渲染器,有两种方法可以访问材质,材质[]材质和材质,实际上相当于(省略了数组边界检查和空检查)

material { get { return material[0]; } set {material[0]=value;}}

对于只有1个子网格的网格,只使用了材质[0],但对于具有子材质的网格(取决于模型的导入方式,有时会将它们分割成单独的单材质对象,有时会得到单个用多种材料网格化。)

现在我不确定我是否会在列表中添加新材料背后的原因,而不是仅使用列表中的最后一种材料(列表有意义)  如果你正在使用多个子网格)

我会建议

的内容
void Start()
{
    teapotRenderer=mTeapot.GetComponent<MeshRenderer>():
}

Material FindMaterial(string buttonName)
{
     switch (buttonName)
        {
            case "red":    return m_TeapotMaterials[0];
            case "blue":   return m_TeapotMaterials[1];
            case "yellow": return m_TeapotMaterials[2];
            case "green":  return m_TeapotMaterials[3];
            default:       return mdefaultMaterial;
        }

}

public void OnButtonPressed(VirtualButtonBehaviour vb)
    {
      mTeapotRenderer.material=FindMaterial(vb.VirtualButtonName);
    }