首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Unity中更改材质的颜色?

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

Stack Overflow用户
提问于 2013-12-16 20:11:37
回答 2查看 15.4K关注 0票数 2

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

代码语言:javascript
运行
AI代码解释
复制
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),每个网格有不同的材质对应于网格的不同部分,它们是没有纹理的材质,只是带有着色器漫反射的纯色。我需要在对象的特定网格中更改其中一种材质的颜色:)

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-16 21:25:58

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

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

代码语言:javascript
运行
AI代码解释
复制
myGameObject.renderer.material.color = Color.Red;

使用所提供的代码的示例如下:

代码语言:javascript
运行
AI代码解释
复制
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
EN

Stack Overflow用户

发布于 2018-03-16 09:47:44

首先,gameObject.renderer已经贬值很久了,您应该显式地使用GetComponent()。

其次,您正在向mActiveMaterials添加(我假设它是一个列表或等效的),但是您似乎没有清除该列表,尽管代码可能工作得很好,但这样做会造成严重的内存泄漏(除非您在其他地方清除该列表)。

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

代码语言:javascript
运行
AI代码解释
复制
material { get { return material[0]; } set {material[0]=value;}}

对于仅包含1个子网格的网格,仅使用材质,但对于包含子材质的网格(这取决于模型的导入方式,有时会将模型分割为单独的单材质对象,有时会得到具有多个材质的单个网格)。

现在,我不确定我是否没有掌握并说明添加新材质到列表的原因,而不是只使用列表中的最后一种材质(如果您使用多个子网格,则列表是有意义的)。

我会建议一些类似的东西

代码语言:javascript
运行
AI代码解释
复制
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);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20619990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档