我知道这是一个愚蠢的问题,但我如何通过脚本引用游戏对象的子(一个多维数据集)(该脚本附加到gameObject)。 (相当于GetComponent之类的东西)
答案 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是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
的引用,child3
是OriginalGameObject
的子项,但您只能引用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 行, 我的玩家层次结构是这样的:
-播放器
代码:
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>();