如何通过脚本查找GameObject的子节点或附加到子GameObject的脚本

我知道这是一个愚蠢的问题,但我如何通过脚本引用游戏对象的子(一个多维数据集)(该脚本附加到gameObject)。 (相当于GetComponent之类的东西)

按索引查找子GameObject

您可以使用GetChild函数获取GameObject的第一个子节点。

 GameObject originalGameObject = GameObject.Find("MainObj"); GameObject child = originalGameObject.transform.GetChild(0).gameObject; 

您可以通过向GetChild函数提供子GameObject的索引号(例如1,2,3)来获取其他子项。

如果它是原始游戏对象中的孩子的孩子? 我只需要重复它,还是仅仅是第n个

您先找到孩子,然后从参考中找到该孩子的孩子。

假设这是OriginalGameObject / Prefab层次结构:

  • OriginalGameObject
    • child1
    • 的child2
    • child3
      • childOfChild3

如您所见, OriginalGameObjectchild3child3child3的父child3 。 childOfChild3是child3的子child3

假设你想要访问子节点,你只能引用作为父游戏对象的OriginalGameObject

 //Instantiate Prefab GameObject originalGameObject = Instantiate(prefab); //To find `child1` which is the first index(0) GameObject child2 = originalGameObject.transform.GetChild(0).gameObject; //To find `child2` which is the second index(1) GameObject child2 = originalGameObject.transform.GetChild(1).gameObject; //To find `child3` which is the third index(2) GameObject child3 = originalGameObject.transform.GetChild(2).gameObject; 

索引从0开始,因此实际索引号就像数组一样是index-1

现在,要获取childOfChild3的引用,它是childOfChild3的子代,但是你只引用了作为父child3 OriginalGameObject

首先,获取child3引用,然后从中获取childOfChild3

 GameObject mychild = originalGameObject.transform.GetChild(2).gameObject; GameObject childOfChild3 = mychild.transform.GetChild(0).gameObject; 

使用循环通过索引查找[all]子GameObject

循环遍历originalGameObject的所有子节点:

 GameObject originalGameObject = Instantiate(prefab); for (int i = 0; i < originalGameObject.transform.childCount; i++) { GameObject child = originalGameObject.transform.GetChild(i).gameObject; //Do something with child } 

您还可以使用transform.FindChild函数按名称查找子项。 我不建议你这样做。 当多个孩子共享同一个名字时,它似乎很慢并且会发生冲突。 这就是你使用GetChild的原因。

按名称查找子GameObject

 GameObject child1 = originalGameObject.transform.FindChild("child1").gameObject; GameObject child2 = originalGameObject.transform.FindChild("child2").gameObject; GameObject child3 = originalGameObject.transform.FindChild("child3").gameObject; 

要查找childOfChild3 ,您可以使用' / '轻松完成,就像使用文件目录一样。 您提供parent/child然后名称。 childOfChild3的父childOfChild3child3 。 所以,我们在FindChild函数中使用childOfChild3/child3

 GameObject childOfChild3 = originalGameObject.transform.FindChild("child3/childOfChild3").gameObject; 

查找附加到子GameObject的脚本/组件

如果你想要的只是附加到子GetComponentInChildren的脚本,那么使用GetComponentInChildren

 MyScript childScript = originalGameObject.GetComponentInChildren(); 

如果有多个具有相同脚本的子项,并且您只想将所有脚本附加到它们,则使用GetComponentsInChildren

 MyScript[] childScripts = originalGameObject.GetComponentsInChildren(); for (int i = 0; i < childScripts.Length; i++) { MyScript myChildScript = childScripts[i]; //Do something with myChildScript } 

gameObject.transform.children包含给定gameObject.transform.children所有直接子gameObject.transform.children 。 您可以迭代它并找到所需的孩子。 例如,按名称;

 for(int i = 0; i < gameObject.transform.childCount;) { if(gameObject.transform.children[i].name == "someName") { // do what you need with it } } 

迭代有几种方法。 您可以使用这些文档中指示的可枚举,或使用FindChild 。

通常,如果您有其他一些标准,例如想要查找具有特定类型Component的子项,而不是仅仅按名称,则需要迭代子项。

你可以在父游戏对象中拥有公共变量。

public Tranform childGameObject;

然后将您的子gameObject分配给它。

这样可以避免隐藏的依赖关系。 您的子多维数据集也可以位于另一个父级和另一个父级内。