来自GameObject数组的GetChild(C#)

时间:2018-01-15 05:42:38

标签: c# unity3d

我遇到了从GameObject数组中获取孩子的麻烦

这是我的剧本:

[SerializeField]
GameObject[] CameraScriptsTV;

protected override void SetPosition()
{
CameraScriptsTV = this.gameObject.transform.GetChild(0).gameObject; //here is the error
   foreach (GameObject TV_CameraScript in CameraScriptsTV)
      {
         TV_CameraScript.GetComponent<Bloom>().enabled = false;
      }
}

我正在使用Transform.GetChild.html

上写的内容让孩子接受

我想要做的就像这样:

在这个脚本中,我从我的层次结构中的Camera中获取了孩子: Image Reference

CameraScriptsAir_1 = this.transform.GetChild(0).GetChild(1).GetChild(0).GetChild(2).GetChild(0).gameObject;
CameraScriptsAir_1.GetComponent<DepthOfFieldDeprecated>().enabled = false;
CameraScriptsAir_1.GetComponent<Bloom>().enabled = false;

所以我在这里得到的是AIR_1(克隆),然后获取脚本Bloom.csDepthOfFieldDeprecated.cs

我希望它清楚。

3 个答案:

答案 0 :(得分:1)

我认为你想要做的就是这个

protected override void SetPosition()
 { 
 foreach (Transform TV_CameraScript in this.transform)
 { 
         TV_CameraScript.GetComponent<Bloom>().enabled = false;
 } 
}

我不明白为什么你会想要一组游戏对象来修改一个组件。

答案 1 :(得分:1)

嗯,还有另一个快捷方式可以实现这一点,你可以使用GetComponentsInChildren()获得所有Bloom组件;

这是解决方案。

[SerializeField]
Bloom[] bloomComponents;

protected override void SetPosition()
{
    //Get all Bloom components from child, and store it in global variable
    bloomComponents = this.gameObject.GetComponentsInChildren<Bloom>();

    //Loop to it and disable it
    foreach (Bloom bloom in bloomComponents)
    {
        bloom.enabled = false;
    }
}

编辑1

如果你的变换有多个分支,我们需要递归地找到它,我们将使用一些辅助方法。!

不要忘记在您的脚本中加入using System.Collections.Generic,因为我们使用了List&lt;&gt;类

[SerializeField]
Bloom[] bloomComponents;

protected override void SetPosition()
{
    //Only do it once, we don't want to make it expensive
    if (bloomComponents.Length == 0)
    {
        //Get all Bloom components from child, and store it in global variable
        bloomComponents = GetComponentsInChildrenRecursively<Bloom>(this.transform);
    }

    //Loop to it and disable it
    foreach (Bloom bloom in bloomComponents)
    {
        bloom.enabled = false;
    }
}

//Autoatically Find Component Recursively
public T[] GetComponentsInChildrenRecursively <T>(Transform root)
{
    List<T> results = new List<T>();
    if (root.childCount > 0)
    {
        foreach (Transform t in root)
        {
            //this root has transform in it, so recursive
            //it will call GetComponentsInChildrenRecursively over and over again, till no child
            results.AddRange(GetComponentsInChildrenRecursively<T>(t));
        }
    }

    //Add to the results
    results.AddRange(root.gameObject.GetComponentsInChildren<T>());
    return results.ToArray();
}
如果这显示有些错误,请告诉我,由于我的办公室笔记本电脑没有统一IDE,我无法测试它。

请注意:不要在非常庞大的转换层次结构中使用它,因为它会遍历所有转换层次结构。

答案 2 :(得分:0)

我这样做就解决了这个问题

CameraScriptsTV[0] = this.transform.GetChild(0).GetChild(1).GetChild(5).GetChild(0).GetChild(0).gameObject;
CameraScriptsTV[1] = this.transform.GetChild(0).GetChild(1).GetChild(6).GetChild(0).GetChild(0).gameObject;
CameraScriptsTV[2] = this.transform.GetChild(0).GetChild(1).GetChild(7).GetChild(0).GetChild(0).gameObject;

而不是将其作为foreach语句。但我仍然不满意,因为这是一个不好的做法。我不知道如何缩短或优化此代码作为for循环语句。

编辑:所以从那里我想出了这个

for(int i=0; i<29; i++)
{
    Tests[i]= this. transform.GetChild(0).GetChild(1).GetChild(i+7).GetChild(0).GetChild(0).gameObject; 
}