[RESOLU] Possible optimisation de script sur les Boutons ?
-
- Messages : 10
- Inscription : 07 Août 2016 20:44
[RESOLU] Possible optimisation de script sur les Boutons ?
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:
J'ai donc écris un script contenant une fonction pour chaque bouton que j’attribue à ceux-ci via le Component Event Trigger:
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
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:
J'ai donc écris un script contenant une fonction pour chaque bouton que j’attribue à ceux-ci via le Component Event Trigger:
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
Re: [DB-AL] Possible optimisation du script?
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 :
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.
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;
}
ç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.
-
- Messages : 10
- Inscription : 07 Août 2016 20:44
Re: [DB-AL] Possible optimisation du script?
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:
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):
Sinon tu as raison je vais déclarer les couleurs au début ce sera mieux organisé.
Du coup je met résolu?
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:
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);
}
}
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
Re: [DB-AL] Possible optimisation du script?
Et pourquoi pas un truc dans ce genre là:
et mettre la valeur de l'index de la liste des bouton dans le champ de l'Event Trigger
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);
}
}
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.
Re: [DB-AL] Possible optimisation du script?
Parce que de tout manière il faut récupérer la valeur de l'index, c'est bien ça le problème.emile121153 a écrit : ↑18 Oct 2018 18:47Et pourquoi pas un truc dans ce genre là:
et mettre la valeur de l'index de la liste des bouton dans le champ de l'Event TriggerCode : 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); } }
De plus GetComponent est une fonction très gourmande à vraiment éviter à chaque fois que l'on peut.
Re: [DB-AL] Possible optimisation du script?
Comme çaLiven 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.
Je ne vois pas le problème.
Comme ça...Liven a écrit :e plus GetComponent est une fonction très gourmande à vraiment éviter à chaque fois que l'on peut.
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);
}
}
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.
-
- Messages : 10
- Inscription : 07 Août 2016 20:44
Re: [DB-AL] Possible optimisation du script?
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.
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.
Par contre j'ai du taper ça:
Comment je met un j'aime sur ton commentaire pour le mettre en avant?
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.
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.
Par contre j'ai du taper ça:
Code : Tout sélectionner
Boutons[index].GetComponentInChildren<Text>().color = new Color32(250, 250, 250, 255);
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
Re: [DB-AL] Possible optimisation du script?
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.
-
- Messages : 10
- Inscription : 07 Août 2016 20:44
Re: Possible optimisation de script sur les Boutons ?
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.
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
Re: [RESOLU] Possible optimisation de script sur les Boutons ?
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.
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.