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

时间:2016-11-22 21:36:05

标签: c# unity3d

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

4 个答案:

答案 0 :(得分:3)

按索引查找子游戏对象

您可以使用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

正如您所见,OriginalGameObjectchild1child2child3的父级。 childOfChild3是child3的孩子。

我们假设您要访问childs并且您只引用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的引用,child3OriginalGameObject的子项,但您只能引用child3作为父GameObject:

首先,获取childOfChild3的引用,然后从中获取GameObject mychild = originalGameObject.transform.GetChild(2).gameObject; GameObject childOfChild3 = mychild.transform.GetChild(0).gameObject;

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

通过带循环的索引查找[all]子GameObject:

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

transform.FindChild

您还可以使用GetChild功能按名称查找子项。我不建议你这样做。当多个孩子共享同一个名字时,它似乎很慢并且会发生冲突。这就是您使用GameObject child1 = originalGameObject.transform.FindChild("child1").gameObject; GameObject child2 = originalGameObject.transform.FindChild("child2").gameObject; GameObject child3 = originalGameObject.transform.FindChild("child3").gameObject;

的原因

按名称查找子游戏对象

childOfChild3

要查找/,您可以轻松地使用&#39; parent/child&#39;就像你使用文件目录一样。您提供childOfChild3名称。 child3的父级是childOfChild3/child3。因此,我们在FindChild函数中使用GameObject childOfChild3 = originalGameObject.transform.FindChild("child3/childOfChild3").gameObject;

MyScript childScript = originalGameObject.GetComponentInChildren<MyScript>();

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

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

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

如果有多个孩子使用相同的脚本而你只想获得所有附加的脚本,那么请使用GetComponentsInChildren

shuffle

答案 1 :(得分:1)

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

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

}

有几种方法可以迭代。您可以使用these docs中指示的可枚举,或使用FindChild

如果你有其他一些标准,通常你会想要迭代孩子,比如想要找到一个具有特定类型Component的孩子,而不是仅仅按名字。

答案 2 :(得分:0)

您可以在父游戏对象中使用公共变量。

public Tranform childGameObject;

然后将您的子游戏对象分配给它。

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

答案 3 :(得分:0)

我发现这个非常简短的方法只有 2 行, 我的玩家层次结构是这样的:

-播放器

  1. BulletPos

代码:

Transform[] ObjectChildrens;
ObjectChildrens = gameObject.GetComponentsInChildren<Transform>();
GameObject Head = System.Array.Find(ObjectChildrens, p => p.gameObject.name == "Head").gameObject;


GameObject BulletPos = System.Array.Find(ObjectChildrens, p => p.gameObject.name == "BulletPos").gameObject;
GameObject LifeProgresBar = System.Array.Find(ObjectChildrens, p => p.gameObject.name == "LifeProgresBar").gameObject.GetComponent<Text>().text = "100";
CapsuleCollider2D cc = System.Array.Find(ObjectChildrens, p => p.gameObject.name == "HeadPlace").gameObject.GetComponent<CapsuleCollider2D>();