如何通过脚本查找游戏对象的子对象或附加到子游戏对象的脚本

r01*_*128 16 c# unity-game-engine

我知道这是一个有点愚蠢的问题,但是我将如何通过脚本(脚本附加到游戏对象)引用游戏对象的子项(立方体)。(相当于 GetComponent 之类的东西)

Pro*_*mer 29

通过索引查找子游戏对象

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

GameObject originalGameObject = GameObject.Find("MainObj");
GameObject child = originalGameObject.transform.GetChild(0).gameObject;
Run Code Online (Sandbox Code Playgroud)

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

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

您首先找到孩子,然后从参考中找到那个孩子的孩子。

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

  • 原始游戏对象
  • 孩子1
  • 孩子2
  • 孩子3
    • childOfChild3

如您所见,OriginalGameObjectchild1,child2和的父级child3。childOfChild3 是 的孩子child3

假设您要访问childs并且您只有OriginalGameObject对父 GameObject 的引用:

//Instantiate Prefab
GameObject originalGameObject  = Instantiate(prefab);

//To find `child1` which is the first index(0)
GameObject child1 = 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;
Run Code Online (Sandbox Code Playgroud)

索引从开始,0所以真正的索引号index-1就像数组一样。

现在,要获取childOfChild3哪个是其子级的child3引用,但您只能引用OriginalGameObject哪个是父级 GameObject:

首先,获取参考child3然后从中获取childOfChild3

GameObject mychild = originalGameObject.transform.GetChild(2).gameObject;
GameObject childOfChild3 = mychild.transform.GetChild(0).gameObject;
Run Code Online (Sandbox Code Playgroud)

通过循环索引查找 [所有] 子游戏对象

遍历 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
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用该transform.FindChild功能按名称查找孩子。我不建议你这样做。当多个孩子共享相同的名字时,它看起来很慢并且会发生冲突。这就是为什么你使用GetChild.

按名称查找子游戏对象

GameObject child1 = originalGameObject.transform.FindChild("child1").gameObject;
GameObject child2 = originalGameObject.transform.FindChild("child2").gameObject;
GameObject child3 = originalGameObject.transform.FindChild("child3").gameObject;
Run Code Online (Sandbox Code Playgroud)

要查找childOfChild3,您可以/像使用文件目录一样使用“ ”轻松完成此操作。您提供parent/child当时的名称。的父级childOfChild3child3。所以,我们childOfChild3/child3在 FindChild 函数中使用。

GameObject childOfChild3 = originalGameObject.transform.FindChild("child3/childOfChild3").gameObject;
Run Code Online (Sandbox Code Playgroud)

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

如果您只想要附加到子游戏对象的脚本,请使用GetComponentInChildren

MyScript childScript = originalGameObject.GetComponentInChildren<MyScript>();
Run Code Online (Sandbox Code Playgroud)

如果有多个孩子使用相同的脚本,而您只想将所有脚本附加到它们上,请使用GetComponentsInChildren

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