[Résolu] Activate/Desactivate script avec tag

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Leuprochon
Messages : 60
Inscription : 04 Déc 2017 19:12

[Résolu] Activate/Desactivate script avec tag

Message par Leuprochon » 07 Nov 2019 15:03

Bonjour à tous,

Alors désolé si le titre du sujet est mal formulé, si vous avez une meilleure idée je le changerai volontiers !

Alors voici ce que j'aimerais faire :

- Quand un des éléments de mon tag "ActivateDesactivate" est actif, alors je lance la fonction d'un autre script.
- Quand tout les éléments de mon tag "ActivateDesactivate" ne sont plus actifs, alors je lance une autre fonction.

Malheureusement ça ne donne rien et je ne comprends pas trop pourquoi. D'ailleurs si je mets un Debug.Log il marche pas non plus. Si quelqu'un a une idée je suis preneur !

Voici mon code :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ActivateDesactivate : MonoBehaviour
{

    GameObject[] activeDisable;
    public GameObject SlidePannel;

    void Update()
    {

        activeDisable = GameObject.FindGameObjectsWithTag("ActivateDesactivate");
            foreach( GameObject r in activeDisable)
            {
            if (r.activeInHierarchy == true)
            {
                SlidePannel.GetComponent<NavigationDrawer.UI.NavDrawerPanel>().Open();
            }

           }
        
    }
}
Dernière édition par Leuprochon le 08 Nov 2019 03:03, édité 1 fois.

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

Re: Activate/Desactivate script avec tag

Message par jmhoubre » 07 Nov 2019 16:59

Bonjour,
je n'ai peut-être pas bien compris la question, mais le script ci-dessous fonctionne :
  • La scène contient 5 cubes dont 3 avec le tag recherché. 1 cube avec tag et 1 cube sans tag sont désactivés.
  • Tant qu'un cube avec tag est actif la fonction UnElementEstActif() est appelée, quand tous les cubes avec tag sont désactivés, c'est TousLesElementsDesactives() qui est lancée.
  • L'état des 2 cubes sans le tag n'a pas d'importance.

Code : Tout sélectionner

using UnityEngine;

public class ActivateDesactivate : MonoBehaviour {

    GameObject[] activeDisable;

    void Update() {
        bool allObjectsDisable = true;
        activeDisable = GameObject.FindGameObjectsWithTag("ActivateDesactivate");
        
        foreach (GameObject r in activeDisable) {
            if (r.activeInHierarchy) {
                // Debug.Log(r.name + " est actif");
                allObjectsDisable = false;
                break;
            }
        }
        
        if (allObjectsDisable) {
            TousLesElementsDesactives();
        } else {
            UnElementEstActif();
        }
    }

    void TousLesElementsDesactives() {
        Debug.Log("Tous les éléments désactivés.");
    }

    void UnElementEstActif() {
        Debug.Log("Au moins un élément est activé");
    }
}

Leuprochon
Messages : 60
Inscription : 04 Déc 2017 19:12

Re: Activate/Desactivate script avec tag

Message par Leuprochon » 08 Nov 2019 03:02

Bonsoir,

Merci pour ta réponse !
Alors malgré X tentatives je n'ai pas réussi à faire fonctionner correctement ce sript. En fait il reste bloqué dans la partie "foreach" et il n'arrive pas à en sortir !

En bidouillant un peu j'ai réussi à faire ce que je voulais comme ça :

Code : Tout sélectionner

activeDisable = GameObject.FindGameObjectsWithTag("ActivateDesactivate");

        if (Input.GetMouseButton(0))
        {
                TousLesElementsDesactives();

            foreach (GameObject r in activeDisable)
            {
                if (r.activeInHierarchy == true )
                {
                    UnElementEstActif();
                }
            }

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

Re: Activate/Desactivate script avec tag

Message par Max » 08 Nov 2019 08:57

Bonjour,
Leuprochon a écrit :
08 Nov 2019 03:02
Alors malgré X tentatives je n'ai pas réussi à faire fonctionner correctement ce sript. En fait il reste bloqué dans la partie "foreach" et il n'arrive pas à en sortir !
Le genre de code qui fait frémir :mrgreen: et pour ton appli, potentiellement un beau freeze.
Pourquoi placer ce genre de chose dans l'Update ? Est-il utile que cela soit exécuté en permanence et plusieurs dizaines de fois par seconde ?
L'emploi de fonction comme FindGameObjectsWithTag (pourquoi ne pas faire une mise en cache?) ou foreach (les boucles d'une manière générale) sont très fortement déconseillé au sein des callbacks comme Update, FixedUpdate et consœur.
Il serait plus sein d'écrire une fonction dédiée à appeler au moment opportun. D'ailleurs tu t'en sors avec l’artifice de l'Input.GetMouseButton, qui en quelque sorte simule cette approche ;)
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

Leuprochon
Messages : 60
Inscription : 04 Déc 2017 19:12

Re: [Résolu] Activate/Desactivate script avec tag

Message par Leuprochon » 08 Nov 2019 13:19

Merci pour cet éclairage ! C'est bon à savoir quand on débute !!

Répondre

Revenir vers « Scripting »