我正在开发一个使用虚拟按钮的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),每个网格有不同的材质对应于网格的不同部分,它们是没有纹理的材质,只是带有着色器漫反射的纯色。我需要在对象的特定网格中更改其中一种材质的颜色:)
任何帮助都是非常感谢的。
发布于 2013-12-16 21:25:58
来自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;
}
发布于 2018-03-16 09:47:44
首先,gameObject.renderer已经贬值很久了,您应该显式地使用GetComponent()。
其次,您正在向mActiveMaterials添加(我假设它是一个列表或等效的),但是您似乎没有清除该列表,尽管代码可能工作得很好,但这样做会造成严重的内存泄漏(除非您在其他地方清除该列表)。
现在,对于每个网格渲染器,有两种方法可以访问材质,即Material[]材质和材质,这实际上等同于(省略了数组边界检查和空检查)
material { get { return material[0]; } set {material[0]=value;}}
对于仅包含1个子网格的网格,仅使用材质,但对于包含子材质的网格(这取决于模型的导入方式,有时会将模型分割为单独的单材质对象,有时会得到具有多个材质的单个网格)。
现在,我不确定我是否没有掌握并说明添加新材质到列表的原因,而不是只使用列表中的最后一种材质(如果您使用多个子网格,则列表是有意义的)。
我会建议一些类似的东西
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);
}
https://stackoverflow.com/questions/20619990
复制相似问题