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
的列表的引用,因此每次调用该函数时,它都会清除同一个列表并再次填充它.然后将该引用分配给 firstChildren
和 secondChildren
变量(假设没有其他外部引用,您最初初始化它们的空列表将被丢弃并被垃圾收集)。 childrenItem
、firstChildren
和 secondChildren
都指向完全相同的列表。
当您将 new
声明移动到 getChildren()
函数中时,它会在每次调用该函数时创建一个新列表,因此它不会覆盖任何现有列表。然后将这些新列表分配给 firstChildren
和 secondChildren
变量(这意味着您最初初始化它们的 new 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
的列表的引用,因此每次调用该函数时,它都会清除同一个列表并再次填充它.然后将该引用分配给 firstChildren
和 secondChildren
变量(假设没有其他外部引用,您最初初始化它们的空列表将被丢弃并被垃圾收集)。 childrenItem
、firstChildren
和 secondChildren
都指向完全相同的列表。
当您将 new
声明移动到 getChildren()
函数中时,它会在每次调用该函数时创建一个新列表,因此它不会覆盖任何现有列表。然后将这些新列表分配给 firstChildren
和 secondChildren
变量(这意味着您最初初始化它们的 new List
已过时)。