[RESOLU][ DB-AL] recherche de gameObjects ayant un certain tag mais qui ne sont pas enfants d'un autre GameObjet

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Murdeau
Messages : 21
Inscription : 30 Juil 2020 14:03
Localisation : Grenoble

[RESOLU][ DB-AL] recherche de gameObjects ayant un certain tag mais qui ne sont pas enfants d'un autre GameObjet

Message par Murdeau » 30 Juil 2020 19:36

Bonjour la communauté. :)

Y a-t'il un moyen d'indiquer dans un script qu'on ne veut pas de recherche avec FindGameObjectWithTag parmi les enfants et petits enfants d'un gameObject?

Je m'explique:
Dans Hierarchy, j'ai Canvas qui a des enfants. Et un de ces enfants a aussi des enfants (6) : 2 avec le tag "a", 2 avec le tag "b", 2 avec le tag"c".
Dans Hierarchy, j'ai aussi 3 gameObject : Cadre1 avec le tag "a", Cadre2 avec le tag "b" et Cadre3 avec le tag "c".

Dans une fonction je veux désactiver les gameObject cadre1 et cadre3 qui n'ont pas le tag "b", par exemple.
J'ai utilisé un FindGameObjectWithTag("b") pour trouver le gameObject cadre2.
La première fois, il me trouve bien cadre2 mais la fois suivante il me trouve le premier petit-enfant de Canvas qui a le tag "b".

Y a-t'il un moyen d'indiquer dans le script qu'on ne veut pas de recherche parmi les enfants et petits enfants, seulement parmi des GameObject Parents?

Code : Tout sélectionner

    private void desactiveCadre()
    {
        string tagChoisi = "b";
        cadre = GameObject.FindGameObjectWithTag(tagChoisi).GetComponent<Transform>();
        Debug.Log("cadre = " + cadre);
        Debug.Log("tagChoisi = " + tagChoisi);
        //je désactive tous les cadres 
        cadre1.transform.gameObject.SetActive(false);
        cadre2.transform.gameObject.SetActive(false); 
        cadre3.transform.gameObject.SetActive(false);
        //je re-active le cadre qui a le même tag que tagChoisi 
        cadre.transform.gameObject.SetActive(true);  
    }
Merci pour votre aide.
Dernière édition par Murdeau le 31 Juil 2020 15:48, édité 1 fois.

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: [C# -- DB] recherche de gameObjects ayant un certain tag mais qui ne sont pas enfants d'un autre GameObjet

Message par jmhoubre » 30 Juil 2020 23:23

Bonsoir,
tu as lu la doc ?
"This method returns the first GameObject it finds with the specified tag. If a scene contains multiple active GameObjects with the specified tag, there is no guarantee this method will return a specific GameObject"

Tu devrais utiliser FindGameObjectsWithTag :
Returns an array of active GameObjects tagged tag. Returns empty array if no GameObject was found.

Dans ce tableau, il te reste à trouver le bon GameObject.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [C# -- DB] recherche de gameObjects ayant un certain tag mais qui ne sont pas enfants d'un autre GameObjet

Message par boubouk50 » 31 Juil 2020 08:47

Tu peux faire une fonction sélective d'abord avant de choisir.
Le transform d'un gameObject a accès à tous ses enfants avec GetChild (). Tu peux donc récupérer et stocker tous les enfants du Canvas sans leurs enfants à eux.

Code : Tout sélectionner

List <GameObject> children = new List <GameObject> ();
for (int i=0; i<myCanvas.transform.childCount; i++)
{
	children.Add (myCanvas.transform.GetChild (i).gameObject);
}
Attention, ce code n'a été fait à main levée et n'a pas été testé
Tu as donc une liste qui possède uniquement les enfants, tu peux venir tester les tags dans cette liste quand tu veux.

Aussi tu peux donc le faire directement sans stocker les enfants, sur le même principe:

Code : Tout sélectionner

GameObject cadre;
for (int i=0; i<myCanvas.transform.childCount; i++)
{
	cadre = myCanvas.transform.GetChild (i).gameObject;
	if (cadre .CompareTag(myTag))
	{
		cadre.SetActive (false);
		break; //Sort de la boucle
	}
}
Attention, ce code n'a été fait à main levée et n'a pas été testé
Ou encore

Code : Tout sélectionner

GameObject cadre;
for (int i=0; i<myCanvas.transform.childCount; i++)
{
	//Changera l'état d'activité en fonction de la comparaison de tag -> Les gameObjects qui auront le tag myTag seront désactivés, les autres seront activés
	myCanvas.transform.GetChild (i).gameObject.SetActive (!cadre .CompareTag(myTag));
}
Attention, ce code n'a été fait à main levée et n'a pas été testé
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Murdeau
Messages : 21
Inscription : 30 Juil 2020 14:03
Localisation : Grenoble

Re: [C# -- DB] recherche de gameObjects ayant un certain tag mais qui ne sont pas enfants d'un autre GameObjet

Message par Murdeau » 31 Juil 2020 15:48

Bonjour,

Merci pour vos réponses. Elles m'ont donné une ou deux idées. J'ai ainsi découvert le CompareTag("tag") et le GetChild ce qui m'a fait chercher dans la doc un Getparent que je n'ai pas trouvé. Mais j'ai trouvé un Scene.GetRootGameObjects que je n'ai pas su utiliser mais en cherchant sur le net comment l'utiliser, j'ai trouvé une autre solution :hehe: . La voici.

Code : Tout sélectionner

   
  	string tagChoisi = "b";
        foreach (Transform xform in FindObjectsOfType<Transform>())
        {
            if (xform.parent == null && xform.CompareTag(tagChoisi))
            {
                cadre = xform.gameObject.GetComponent<Transform>();
            }
        }
        //je désactive tous les cadres 
        cadre1.transform.gameObject.SetActive(false);
        cadre2.transform.gameObject.SetActive(false); 
        cadre3.transform.gameObject.SetActive(false);
        //je re-active le cadre qui a le même tag que tagChoisi 
        cadre.transform.gameObject.SetActive(true);  
Encore un grand merci. :super:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [résolu][C# -- DB] recherche de gameObjects ayant un certain tag mais qui ne sont pas enfants d'un autre GameObjet

Message par boubouk50 » 31 Juil 2020 16:38

J'avais compris qu'ils étaient enfant du canvas.

Attention, TOUS les gameObjects possèdent un transform, c'est un peu lourd quand même, tu vas tester tous les objets de la scène. Cela peut vite devenir beaucoup.
Ne peux-tu pas simplement les référencer depuis une variable publique?

Mince UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects() n'existe plus.

Ah! Par contre tu peux les récupérer depuis la scène:
https://docs.unity3d.com/ScriptReferenc ... jects.html

Cela te renvoie tous les gameObjects root de la scène dans une liste, il ne te reste plus qu'à vérifier leur tag. Ce sera plus léger.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: [RESOLU][ DB-AL] recherche de gameObjects ayant un certain tag mais qui ne sont pas enfants d'un autre GameObjet

Message par Max » 31 Juil 2020 17:02

Hello,
Murdeau a écrit :
31 Juil 2020 15:48
qui m'a fait chercher dans la doc un Getparent que je n'ai pas trouvé.
A titre d'info, pour connaitre le parent d'un GameObject, il faut simplement regarder du coté de Transform.parent.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « Scripting »