[RESOLU] Possible optimisation de script sur les Boutons ?

Questions à propos du GUI, y compris la partie script.
Répondre
GuepardRex74
Messages : 10
Inscription : 07 Août 2016 20:44

[RESOLU] Possible optimisation de script sur les Boutons ?

Message par GuepardRex74 » 18 Oct 2018 15:15

Bonjour,

Je vous contacte pour savoir si il y a la possibilité de réduire et d'optimiser mon script.

Voici le souci:
Un Canvas contenant plusieurs boutons est présent sur ma scène. Je souhaite que chaque bouton puisse changer la couleur du texte qu'il contient lorsque celui-ci est survolé par la souris:
Image

J'ai donc écris un script contenant une fonction pour chaque bouton que j’attribue à ceux-ci via le Component Event Trigger:

Image

Image

Tout marche ! Mais N'y a t'il pas un moyen de réduire mon script en ne créant qu'une seule fonction qui serait attribuer à tous les boutons via le Component Event Trigger et qui permettrait d'envoyer en paramètre à une autre fonction le nom du bouton (et des textes qu'il contient) à modifier? Je trouve en effet qu'il y a beaucoup trop de répétitions dans ce script mais je ne sais pas comment détecter lequel des boutons est survolé.

Ps: Je ne sais pas comment déplacer mon sujet dans le forum c#. Veuillez m'excuser pour cette inattention lors du post.

En espérant avoir réussit à me faire comprendre.
GuepardRex74
Dernière édition par GuepardRex74 le 18 Oct 2018 19:50, édité 1 fois.
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: [DB-AL] Possible optimisation du script?

Message par Liven » 18 Oct 2018 17:27

A ma connaissance il n'y a pas moyen de pointer tous tes boutons vers une même fonction qui n’exécuterait pas exactement le même code. Si quelqu'un connais une solution je suis aussi preneur. Il faut au moins pouvoir envoyer une variable, mais je vois pas trop comment sans complexifier inutilement.

j'ai pas tout compris à ta hiérarchie (l’intérêt des gameobjet blablatext) et de ton code (comment t’arrive à aller chercher du text sur tes boutons-ou alors tu leur a ajouté un composant text manuellement)

Du coup je vais faire comme si j'avais rien vu et prendre ton problème à la racine : changer la couleur du texte lorsque l'on passe la souris sur le bouton.

Ta partie "event trigger" est ok à mon avis.
Pour la partie hiérarchie, je part sur le principe que chaque bouton a un enfant contenant le composant text (comme les boutons par défaut)

et pour le code plutôt quelque chose comment ça :

Code : Tout sélectionner

    [SerializeField] private Text objetTexteDuBouton01;
    [SerializeField] private Text objetTexteDuBouton02;

    [SerializeField] private Color couleurSurlignee;
    [SerializeField] private Color couleurSurNonlignee;

    public void MrPointyIsHere1 ()
    {
        objetTexteDuBouton01.color = couleurSurlignee;
    }

    public void MrPointyIsHere2()
    {
        objetTexteDuBouton02.color = couleurSurlignee;
    }

    public void MrPointyIsGone()
    {
        objetTexteDuBouton01.color = couleurSurNonlignee;
        objetTexteDuBouton02.color = couleurSurNonlignee;
    }

    //////////////////////// OU ALORS ///////////////////////////////

    public void MrPointyIsHere1bis()
    {
        ChangeColor(objetTexteDuBouton01, couleurSurlignee);
    }

    public void MrPointyIsHere2bis()
    {
        ChangeColor(objetTexteDuBouton02, couleurSurlignee);
    }

    public void MrPointyIsGonebis()
    {
        ChangeColor(objetTexteDuBouton01, couleurSurNonlignee);
        ChangeColor(objetTexteDuBouton02, couleurSurNonlignee);
    }

    private void ChangeColor (Text objetTexteDuBouton, Color CouleurVoulue)
    {
        objetTexteDuBouton.color = CouleurVoulue;
    }
    
Du coup il reste à glisser dans l'inspector chaque objet qui contient le text dans les champs appropriés et de choisir les couleurs.

ça ne réduit pas le nombre de fonction et n'épargne pas la nécessité d'en créer une nouvelle pour chaque bouton créé, mais c'est un peut plus clair, opti, et facile à maintenir/faire évolué.

PS : lorsque tu veux montrer du code, préfère le coller entre les balise appropriées (cherche dans la barre du haut) plutôt que les screens car on peux pas copier coller le code des screen ce qui peut être très gènant pour ceux qui voudraient t'aider.

GuepardRex74
Messages : 10
Inscription : 07 Août 2016 20:44

Re: [DB-AL] Possible optimisation du script?

Message par GuepardRex74 » 18 Oct 2018 18:45

Salut et merci pour ta réponse rapide !!!

Pour la hiérarchie, les premiers textes sont effectivement les enfants des différents boutons.
Les gameObject blablatext sont en fait des textes ajoutés qui viennent s'afficher au survol de la souris. Voici par exemple une image illustrant l'apparition d'une phrase en bas du menu lors du survol par la souris du bouton Quit Game:
Image Tu peut voir en bas la phrase <Quit the game> qui apparait (c'est vraiment un détail).

Excuse moi pour les balises, voici le code en entier (Les premières variables "Text" contiennent les composant text enfant de chaque bouton et la deuxième série de variable contient les blablaText):

Code : Tout sélectionner

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class MainMenuScript : MonoBehaviour {

	public GameObject MainMenu;
	public GameObject ControlsMenu;
	public GameObject Manager;

    public Text StoryMode;
    public Text SurvivalMode;
    public Text Bonus;
    public Text Options;
    public Text QuitGame;

    public Text StoryModeText;
    public Text SurvivalModeText;
    public Text BonusText;
    public Text OptionsText;
    public Text QuitGameText;



    public void Quit () {
		Application.Quit();
	}

	public void PlayGame () {
		Manager.gameObject.SetActive (true);
		SceneManager.LoadScene(1);
	}

	public void Controls () {
		ControlsMenu.gameObject.SetActive (true);
		MainMenu.gameObject.SetActive (false);
	}

    public void MrPointyIsHere1()
    {
        StoryMode.GetComponent<Text>().color = new Color32(250, 250, 250, 255);
        StoryModeText.gameObject.SetActive(true);
    }
    public void MrPointyIsHere2()
    {
        SurvivalMode.GetComponent<Text>().color = new Color32(250, 250, 250, 255);
        SurvivalModeText.gameObject.SetActive(true);
    }
    public void MrPointyIsHere3()
    {
        Bonus.GetComponent<Text>().color = new Color32(250, 250, 250, 255);
        BonusText.gameObject.SetActive(true);
    }
    public void MrPointyIsHere4()
    {
        Options.GetComponent<Text>().color = new Color32(250, 250, 250, 255);
        OptionsText.gameObject.SetActive(true);
    }
    public void MrPointyIsHere5()
    {
        QuitGame.GetComponent<Text>().color = new Color32(250, 250, 250, 255);
        QuitGameText.gameObject.SetActive(true);
    }
    public void MrPointyIsGone()
    {
        StoryMode.GetComponent<Text>().color = new Color32(121, 121, 121, 255);
        SurvivalMode.GetComponent<Text>().color = new Color32(121, 121, 121, 255);
        Bonus.GetComponent<Text>().color = new Color32(121, 121, 121, 255);
        Options.GetComponent<Text>().color = new Color32(121, 121, 121, 255);
        QuitGame.GetComponent<Text>().color = new Color32(121, 121, 121, 255);

        StoryModeText.gameObject.SetActive(false);
        SurvivalModeText.gameObject.SetActive(false);
        BonusText.gameObject.SetActive(false);
        OptionsText.gameObject.SetActive(false);
        QuitGameText.gameObject.SetActive(false);
    }
}
Sinon tu as raison je vais déclarer les couleurs au début ce sera mieux organisé.
Du coup je met résolu?
Dernière édition par GuepardRex74 le 18 Oct 2018 18:49, édité 2 fois.
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: [DB-AL] Possible optimisation du script?

Message par EmileF » 18 Oct 2018 18:47

Et pourquoi pas un truc dans ce genre là:

Code : Tout sélectionner

    public GameObject[] Boutons;  //La liste des Boutons avec le Component<Text>

    public void MrPointyIsHere(int index)
    {
        Boutons[index].GetComponent<Text>().color = new Color32(250, 250, 250, 255);
        Boutons[index].SetActive(true);
    }

    public void MrPointyIsGone()
    {
        for (int i = 0; i < Boutons.Length; i++)
        {
            Boutons[i].GetComponent<Text>().color = new Color32(121, 121, 121, 255);
            Boutons[i].SetActive(false);
        }
    }

et mettre la valeur de l'index de la liste des bouton dans le champ de l'Event Trigger
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: [DB-AL] Possible optimisation du script?

Message par Liven » 18 Oct 2018 19:10

emile121153 a écrit :
18 Oct 2018 18:47
Et pourquoi pas un truc dans ce genre là:

Code : Tout sélectionner

    public GameObject[] Boutons;  //La liste des Boutons avec le Component<Text>

    public void MrPointyIsHere(int index)
    {
        Boutons[index].GetComponent<Text>().color = new Color32(250, 250, 250, 255);
        Boutons[index].SetActive(true);
    }

    public void MrPointyIsGone()
    {
        for (int i = 0; i < Boutons.Length; i++)
        {
            Boutons[i].GetComponent<Text>().color = new Color32(121, 121, 121, 255);
            Boutons[i].SetActive(false);
        }
    }

et mettre la valeur de l'index de la liste des bouton dans le champ de l'Event Trigger
Parce que de tout manière il faut récupérer la valeur de l'index, c'est bien ça le problème.
De plus GetComponent est une fonction très gourmande à vraiment éviter à chaque fois que l'on peut.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: [DB-AL] Possible optimisation du script?

Message par EmileF » 18 Oct 2018 19:36

Liven a écrit :Parce que de tout manière il faut récupérer la valeur de l'index, c'est bien ça le problème.
Comme ça
Image

Je ne vois pas le problème.
Liven a écrit :e plus GetComponent est une fonction très gourmande à vraiment éviter à chaque fois que l'on peut.
Comme ça...

Code : Tout sélectionner

    public Text[] Boutons;  //La liste des Boutons avec le Component<Text>

    public void MrPointyIsHere(int index)
    {
        Boutons[index].color = new Color32(250, 250, 250, 255);
        Boutons[index].gameObject.SetActive(true);
    }

    public void MrPointyIsGone()
    {
        for (int i = 0; i < Boutons.Length; i++)
        {
            Boutons[i].color = new Color32(121, 121, 121, 255);
            Boutons[i].gameObject.SetActive(false);
        }
    }

C'est pas bon comme ça?
Dernière édition par EmileF le 18 Oct 2018 19:39, édité 3 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

GuepardRex74
Messages : 10
Inscription : 07 Août 2016 20:44

Re: [DB-AL] Possible optimisation du script?

Message par GuepardRex74 » 18 Oct 2018 19:37

Si ça marche !!!
Merci beaucoup emile121153 !!!

Liven en fait en créant un gameObject[] bouton, il y a un onglet bouton qui s'ouvre dans les variables du script. On peut alors y rentrer le nombre de boutons que l'on veut et quel bouton est associé à quel élément.
Image

Dans l'onglet Event Trigger une fenêtre apparait après la sélection de la fonction contenant le paramètre int. On peut y rentrer la valeur que doit renvoyer le bouton.
Image

Par contre j'ai du taper ça:

Code : Tout sélectionner

Boutons[index].GetComponentInChildren<Text>().color = new Color32(250, 250, 250, 255);
Comment je met un j'aime sur ton commentaire pour le mettre en avant?
Dernière édition par GuepardRex74 le 18 Oct 2018 19:43, édité 1 fois.
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: [DB-AL] Possible optimisation du script?

Message par EmileF » 18 Oct 2018 19:42

Nos message se sont croisés regarde mon script juste avant ton message au lieu de GameObject[] mettre Text[] et mofifier le script en conséquence.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

GuepardRex74
Messages : 10
Inscription : 07 Août 2016 20:44

Re: Possible optimisation de script sur les Boutons ?

Message par GuepardRex74 » 18 Oct 2018 19:48

Merci beaucoup !!!
Je met le sujet en résolu et Liven si tu n'as pas compris n'hésite pas je t'explique. On peut bien renvoyer l'Index.
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: [RESOLU] Possible optimisation de script sur les Boutons ?

Message par Liven » 18 Oct 2018 20:43

hooo, ben voila !

J'avais pas capté que mettre des valeur en entrée dans une fonction permettait d'y accéder dans les events.
On en apprend tous les jours.
Du coup effectivement ta solution est plus simple.

Répondre

Revenir vers « L'interface GUI »