unity C#-定义列表的正确位置

unity C#- where is the right place to define list

我的场景中有这样一个结构,我首先要得到的是Building(test01,test02,test03)下的所有children,然后遍历这些children找到所有sub-children, 在这种情况下 (Cube01, Cube02.Cube03)

我的代码是:

List<GameObject> childrenItem = new List<GameObject>();
List<GameObject> firstChildren = new List<GameObject>();
List<GameObject> secondChildren = new List<GameObject>();

private List<GameObject> getChildren(GameObject parentRoot)
{
    childrenItem.Clear();
    for (int i = 0; i < parentRoot.transform.childCount; i++)
    {
        childrenItem.Add(parentRoot.transform.GetChild(i).gameObject);
    }
    return childrenItem;
}

private void OnGUI()
{
    if(GUILayout.Button("Test"))
    {
        firstChildren = getChildren(GameObject.Find("Building"));
        
        for (int i = 0; i < firstChildren.Count; i++)
        {

            secondChildren = getChildren(GameObject.Find("Building" + "/" + firstChildren[i].name));
            Debug.Log(firstChildren.Count + firstChildren[i].name);
            Debug.Log(secondChildren.Count);
        }

    }
}

我认为它应该输出:

3test01 3

3test02 0

3test03 0

但它是实际输出:

3Cube01 3

Error NullReferenceException:Object reference not set to an instance of an object

似乎在运行这一行之后,secondChildren的值已经赋给了第一个孩子

secondChildren = getChildren(GameObject.Find("Building" + "/" + firstChildren[i].name));

但是如果我在 getChildren[= 中声明 childrenItem 38=]函数,一切恢复正常。为什么会这样?我是 C# 的菜鸟,如果我遗漏了什么,比如变量范围知识,请告诉我,谢谢你们!

private List<GameObject> getChildren(GameObject parentRoot)
{
    List<GameObject> childrenItem = new List<GameObject>();
    for (int i = 0; i < parentRoot.transform.childCount; i++)
    {
        childrenItem.Add(parentRoot.transform.GetChild(i).gameObject);
    }
    return childrenItem;
}

getChildren() 正在返回对创建并存储为 class 变量 childrenItem 的列表的引用,因此每次调用该函数时,它都会清除同一个列表并再次填充它.然后将该引用分配给 firstChildrensecondChildren 变量(假设没有其他外部引用,您最初初始化它们的空列表将被丢弃并被垃圾收集)。 childrenItem firstChildrensecondChildren 都指向完全相同的列表。

当您将 new 声明移动到 getChildren() 函数中时,它会在每次调用该函数时创建一个新列表,因此它不会覆盖任何现有列表。然后将这些新列表分配给 firstChildrensecondChildren 变量(这意味着您最初初始化它们的 new List 已过时)。