[Resolu][Débutant] Ajout de gameobject possedant un component dans une liste

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Zumo
Messages : 23
Inscription : 08 Déc 2022 01:08

[Resolu][Débutant] Ajout de gameobject possedant un component dans une liste

Message par Zumo » 26 Jan 2023 18:11

Bonjour à tous,
Je souhaite créer un script "OnOff" permettant de désactiver tous les composant Light contenus dans les enfants. L'idée c'est de pouvoir déposer le script sur un interupteur sans avoir rien a configurer pour qu'il controle les "lights" enfants. C'est un script que je souhaite pouvoir réutiliser facilement pour d'autres situations.

Pour le moment je fais ça pour switcher (si open = true alors j'allume):

Code : Tout sélectionner

    void FixedUpdate()
    {
        if (locked || gamemanager.dijoncteur == false || !open)
        {
            light1.enabled = false; light2.enabled = false; if(isDebugLog)Debug.Log("IF");
            audiooff.Play();

        }
        else if(!locked || gamemanager.dijoncteur == true || open)
        {
            light1.enabled = true; light2.enabled = true; if (isDebugLog)Debug.Log("ELSE");
            audioon.Play();
Je ne suis pas convaincu que je suis parti sur le bon chemin pour controler les lumières ou les appareils electriques d'un batiment, si vous avez quelques conseils...
La prochaine étape serait donc de chercher dans les enfants de l'interupteur et de les ajouter à une liste.
Je crée la liste :
public List<GameObject> listLights = new List<GameObject>();

et après je ne sais pas comment faire sans utiliser les tags, j'ai tenté ça dans le start :
listLights.AddRange(gameObject.GetComponents<Onoff>());

Mais j'obtiens ça :
Erreur CS1503 Argument 1 : conversion impossible de 'Onoff[]' en System.Collections.Generic.IEnumerable<UnityEngine.GameObject>'

Et je suis perdu...

Après il restera la lecture de la liste pour appliquer le On ou OFF.

Si vous avez un lien ou un tuto pour faire quelque chose dans le genre...
D'avance merci pour votre aide
Dernière édition par Zumo le 26 Jan 2023 19:37, édité 1 fois.

Zumo
Messages : 23
Inscription : 08 Déc 2022 01:08

Re: [Débutant] Ajout de gameobject possedant un component dans une liste

Message par Zumo » 26 Jan 2023 18:41

J'ajoute que j'ai réussi à faire ce que je veux en utilisant les tags mais je souhaite chercher les composants "Light"

Fonctionne :
listLights.AddRange(GameObject.FindGameObjectsWithTag("onoff"));
Fonctionne pô :
listLights.AddRange(GameObject.FindObjectsOfType<Light>());

Puis après :

Code : Tout sélectionner

 void FixedUpdate()
    {
        if (locked || gamemanager.dijoncteur == false || !open)
        {
            //light1.enabled = false; light2.enabled = false; if(isDebugLog)Debug.Log("IF");
            TurnOff();
            audiooff.Play();

        }
        else if(!locked || gamemanager.dijoncteur == true || open)
        {
            //light1.enabled = true; light2.enabled = true; if (isDebugLog)Debug.Log("ELSE");
            TurnOn();
            audioon.Play();
        }
    }
    void TurnOn()
    {
        for (int i = 0; i < listLights.Count; i++)
        {
            listLights[i].SetActive(true);
          
        }
        return;
    }
    void TurnOff()
    {
        for (int i = 0; i < listLights.Count; i++)
        {
            listLights[i].SetActive(false);

        }
        return;
    }

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

Re: [Débutant] Ajout de gameobject possedant un component dans une liste

Message par boubouk50 » 26 Jan 2023 19:03

Salut,

pour récupérer les objets enfants possédant un component spécifique tu as une fonction dédiée:
GetComponentsInChildren ()
Elle te renvoie tous les components des enfants possédant ce component spécifique.
Ainsi, tu peux aisément boucler sur le tableau pour définir l'état de chacun.

Exemple:

Code : Tout sélectionner

// Récupère tous les components Light présents dans les enfants de l'objet sur lequel est affecté ce script. True signifie que les components inactifs sont aussi récupérés
Light[] lights = GetComponentsInChildren <Light>(true);
// On boucle dans le tableau de Light récupéré plus haut. Pour chaque light présent dans le tableau lights
foreach (Light light in lights)
	// On active ou désactive son component Light (light.gameObject.SetActive (true ou false) pour dés/activer le gameObject)
	light.enabled= //La valeur booléenne;
Le mieux étant de récupérer les enfants en dehors de l'Update ()
"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

Zumo
Messages : 23
Inscription : 08 Déc 2022 01:08

Re: [Débutant] Ajout de gameobject possedant un component dans une liste

Message par Zumo » 26 Jan 2023 19:36

Alors j'avais bien essayé avec cette fonction mais je n'ai pas réussi à l'utiliser. J'ai réussi à faire ce que je voulais avec ton exemple merci bcp. Il me reste plus qu'a comprendre comment ça marche ^^

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

Re: [Resolu][Débutant] Ajout de gameobject possedant un component dans une liste

Message par boubouk50 » 27 Jan 2023 09:41

Je t'ai commenté l'exemple si ça peut t'aider à comprendre.
"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

Zumo
Messages : 23
Inscription : 08 Déc 2022 01:08

Re: [Resolu][Débutant] Ajout de gameobject possedant un component dans une liste

Message par Zumo » 28 Jan 2023 11:02

Wahou, c'est génial merci bcp !

Répondre

Revenir vers « Scripting »