我有一组3D模型,每个模型都有自己的材料元素。一个模型在网格渲染器中包含所有元素,对我来说,很容易对每个元素进行更改,如下所示:
用于进行更改的代码
public Renderer[] rend;
rend[PlayerPrefs.GetInt("SelectedBall")].materials[0].color = currentcolor;
if (PlayerPrefs.GetInt("SelectedBall") == 1)
{
rend[PlayerPrefs.GetInt("SelectedBall")].materials[0].color = Color.white;
rend[PlayerPrefs.GetInt("SelectedBall")].materials[1].color = currentcolor;
rend[PlayerPrefs.GetInt("SelectedBall")].materials[2].color = currentcolor;
rend[PlayerPrefs.GetInt("SelectedBall")].materials[3].color = currentcolor;
}
我有一个带有2个子对象的第二个模型,每个子对象都有自己的元素。
我面临的挑战是,如果我使用上面的相同代码,那么它只会影响“ Cylinder001”元素。
如何使用一个代码访问Sphere003元素并进行更改。
谢谢
答案 0 :(得分:0)
我不明白为什么确切地存在一个渲染器数组,或者是否使用它来访问所有模型的所有网格渲染器,但是这段代码可能有助于解决所有对象的问题:
for (int i = 0; i< gameObject.transform.childCount;i++)
{
rend = gameObject.transform.GetChild(i).GetComponent<MeshRenderer>();
rend.materials[0].color = Color.white;
for(int j = 1; j<rend.materials.Length;j++)
{
rend.materials[j].color = currentcolor;
}
}
答案 1 :(得分:0)
如果要遍历变换树,例如要获取同级组件(我知道您想影响同级对象的MeshRenderer),则可以使用transform.parent来将级别上移。
GameObject parentGameObject=transform.parent.gameObject;
MeshRenderer[] allMeshRenderers=parentGameObject.GetComponentsInChildren<MeshRenderer>();
然后,您可以遍历渲染器并随意更改颜色/材质