我遇到了从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;
}
}
上写的内容让孩子接受
我想要做的就像这样:
在这个脚本中,我从我的层次结构中的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.cs
和DepthOfFieldDeprecated.cs
。
我希望它清楚。
答案 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;
}
}
如果你的变换有多个分支,我们需要递归地找到它,我们将使用一些辅助方法。!
不要忘记在您的脚本中加入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;
}