1
votes

Comment vérifier quels enfants sont actifs au sein d'un parent dans Unity?

J'ai une liste de caméras sous un parent "Caméras":  entrez la description de l'image ici

Dans mon jeu, je souhaite régler la relativité de mon personnage sur la caméra active. Par exemple, si Camera012 est active, définissez les commandes du personnage pour qu'elles soient relatives à Camera012. Cependant, je ne sais pas comment vérifier via un objet parent pour voir quels enfants sont activés ou non.


0 commentaires

3 Réponses :


0
votes
if (Camera002.activeInHierarchy) {
// do something
}
if you need you can add all camera to an array and use for loop to check each camera

3 commentaires

Votre réponse est très proche de la perfection, mais j'aimerais que vous clarifiiez un peu plus ce que vous entendez par «ajouter toutes les caméras à un tableau et utiliser la boucle for pour vérifier chaque caméra». :)


Voulez-vous dire quelque chose comme GameObject [] caméras = GetComponentsInChildren (); foreach (GameObject currentCam dans les caméras) {if (currentCam.activeInHierarchy) {camF = currentCam.transform.forward; camR = currentCam.transform.right; }} ?


vous pouvez faire plusieurs manières différentes, vous pouvez ajouter une balise ‘camera’ à toutes les caméras et sur les caméras GameObject Start ou Awake [] = GameObject.FindGameObjectsWithTag (“camera”);



1
votes

Si vous demandez simplement des enfants qui sont actifs, c'est facile, si vous ne voulez qu'un seul enfant à la fois, ajoutez un sciprt à l'objet Caméras qui inclut

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

Cela ne retournera que la première caméra active

Si vous voulez trouver toutes les caméras actives chez les enfants, alors il retourne un tableau.

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

La différence est que c'est le pluriel (Composants) donc vous obtenez tout objets caméra actifs chez les enfants.

Même si vous voulez des objets inactifs chez les enfants, vous pouvez utiliser

Camera firstactiveCamera = GetComponentInChildren<Camera>();

Si vous envoyez true avec la fonction getcomponent, il trouve même objets inactifs et les renvoyer dans un tableau.


2 commentaires

Il semble que votre code recherche des objets dans un parent qui a le composant "Caméra". Je demandais comment je pourrais trouver des enfants qui ont setactive (true)


List activeGameobjects = new List (); for (int i = 0; i



0
votes

L'inconvénient de GetComponentsInChildren (comme suggéré ici ) est qu'il retourne également plus loin enfants imbriqués et ne regarde pas seulement à travers les enfants de premier niveau.

Aussi activeInHierarchy (comme suggéré ici ) renvoie uniquement true , si tous les parents de la hiérarchie de l'objet examiné sont également actifs.


En général, vous pouvez parcourir tous les enfants de premier niveau de un GameObject en utilisant

// 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!");
    }
}

et vérifier si un enfant est actif ou non en utilisant

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

cela fonctionne aussi si un parent dans les objets La hiérarchie est inactive mais l'enfant lui-même est actif.


0 commentaires