在我的游戏中,我想把角色的相对性设置为哪个摄像机活动。例如,如果Camera012是活动的,那么就将角色的控制设置为相对于Camera012。然而,我不知道如何通过父对象来检查哪些子对象被设置为活动状态。
if (Camera002.activeInHierarchy) {
// do something
}
如果你需要的话,你可以把所有的摄像机添加到一个数组中,然后使用for循环来检查每个摄像机。
如果你只要求子代是活动的,那么很容易,如果你只想要一个子代,那么在Cameras对象中添加一个sciprt,包括
Camera firstactiveCamera = GetComponentInChildren<Camera>();
这将只返回第一个活动的摄像机
如果你想找到子系统中所有的活动摄像机,那么它将返回一个数组。
Camera[] activeCamerasInChildren = GetComponentsInChildren<Camera>();
不同的是这个数组是复数(Components),所以你可以得到子系统中所有的活动相机对象。
即使你想在子系统中找到非活动的对象,你也可以使用
Camera[] activeCamerasInChildren = GetComponentsInChildren<Camera>(true);
如果你用函数getcomponent发送true,它甚至会找到不活动的对象并以数组形式返回。
的缺点是 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!");
}
}
如果对象层次结构中的任何父对象是不活动的,而子对象本身是活动的,这也是有效的。