我正在开发一个使用虚拟按钮的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),每个网格都有不同的材质对应网格的不同部分,它们是没有纹理的材质,只是一个纯色的着色器漫反射。 我需要在对象的特定网格中更改其中一种材质的颜色:)
非常感谢任何帮助。
答案 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);
}