操纵子对象的物质元素

时间:2018-12-18 08:14:44

标签: c# unity3d

我有一组3D模型,每个模型都有自己的材料元素。一个模型在网格渲染器中包含所有元素,对我来说,很容易对每个元素进行更改,如下所示:

enter image description here

用于进行更改的代码

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个子对象的第二个模型,每个子对象都有自己的元素。

enter image description here

我面临的挑战是,如果我使用上面的相同代码,那么它只会影响“ Cylinder001”元素。

如何使用一个代码访问Sphere003元素并进行更改。

谢谢

2 个答案:

答案 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>();

然后,您可以遍历渲染器并随意更改颜色/材质