如何在Unity中检查父代中哪些子代是活动的?

问题描述 投票:0回答:1

我在一个 "Cameras "父类下有一个摄像机列表。enter image description here

在我的游戏中,我想把角色的相对性设置为哪个摄像机活动。例如,如果Camera012是活动的,那么就将角色的控制设置为相对于Camera012。然而,我不知道如何通过父对象来检查哪些子对象被设置为活动状态。

c# unity3d parent children
1个回答
0
投票
if (Camera002.activeInHierarchy) {
// do something
}

如果你需要的话,你可以把所有的摄像机添加到一个数组中,然后使用for循环来检查每个摄像机。


1
投票

如果你只要求子代是活动的,那么很容易,如果你只想要一个子代,那么在Cameras对象中添加一个sciprt,包括

Camera firstactiveCamera = GetComponentInChildren<Camera>();

这将只返回第一个活动的摄像机

如果你想找到子系统中所有的活动摄像机,那么它将返回一个数组。

Camera[] activeCamerasInChildren = GetComponentsInChildren<Camera>();

不同的是这个数组是复数(Components),所以你可以得到子系统中所有的活动相机对象。

即使你想在子系统中找到非活动的对象,你也可以使用

Camera[] activeCamerasInChildren = GetComponentsInChildren<Camera>(true);

如果你用函数getcomponent发送true,它甚至会找到不活动的对象并以数组形式返回。


0
投票

的缺点是 GetComponentsInChildren (按建议 此处)是它也会最终返回更多的嵌套子代,而不仅仅是查看第一级子代。

同时 activeInHierarchy (按建议 此处)只返回 true如果被检查对象的层级中的所有父级也都是活动的,那么就可以进行迭代。


在一般情况下,你可以通过使用

foreach(Transform child in someGameObject.transform)
{
    // use child
}

并检查孩子是否活跃,使用

// the object to examine the childs of
Transform parent;

// iterate through all first level children
foreach(Transform child in parent)
{
    if(child.gameObject.activeSelf)
    {
        Debug.Log($"The child {child.name} is active!");
    }
    else
    {
        Debug.Log($"The child {child.name} is inactive!");
    }
}

如果对象层次结构中的任何父对象是不活动的,而子对象本身是活动的,这也是有效的。

© www.soinside.com 2019 - 2024. All rights reserved.