[Résolu] Incompréhension avec GUI.changed

Questions à propos du GUI, y compris la partie script.
Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

[Résolu] Incompréhension avec GUI.changed

Message par jmhoubre » 21 Avr 2020 20:47

Bonsoir,

je lis la documentation concernant les types de controles avec IMGUI. Je modifie les exemples cités pour aller au bout de mes questions. Toutefois, je bute sur ce code, qui devrait indiquer quelle partie de la Toolbar a été cliquée :

Code : Tout sélectionner

using UnityEngine;

public class GUITest : MonoBehaviour {

	private string textFieldString;
	private string [] toolbarStrings = { "Barre d'outils 1", "Barre d'outils 2", "Barre d'outils 3" };
	private int selectedToolbar = 0;

	void OnGUI () {
		// TextFieldString.
		textFieldString = GUI.TextField (new Rect (20, 110, 150, 30), textFieldString);

		// Toolbar.
		selectedToolbar = GUI.Toolbar (new Rect (20, 230, 300, 30), selectedToolbar, toolbarStrings);
	
		// Détection des changements avec GUI.changed.
		if (GUI.changed) {
			string s = "";
			
			switch (selectedToolbar) {
				case 0:
					s = "Bouton 1";
					break;
				case 1:
					s = "Bouton 2";
					break;
				case 2:
					s = "Bouton 3";
					break;
				default:
					break;
			}
			
			// Affiche le changement.
			Debug.Log ("Bouton " + (selectedToolbar + 1).ToString ());
			textFieldString = GUI.TextField (new Rect (20, 110, 150, 30), s);
			GUI.Label (new Rect (20, 300, 150, 30), s);
		}
	}
}
Cela fonctionne bien pour Debug.Log et textFieldString, mais pas pour GUI.Label, et je ne comprends pas pourquoi.
Dernière édition par jmhoubre le 22 Avr 2020 17:42, édité 1 fois.

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

Re: Incompréhension avec GUI.changed

Message par boubouk50 » 21 Avr 2020 21:01

Qu'affiche le label?
Est-il bien positionné? Je veux dire, ne serait-il pas caché derrière un élément?

D'après la doc, le text de l'inputfield devrait être renvoyé dans lui-même. Ici tu l'affectes à textFieldString. J'en déduis donc que la variable est remise à zéro (vidée). Donc sa valeur est renvoyée dans textFieldString.
Doc: Text to edit. The return value of this function should be assigned back to the string as shown in the example.
Essaie plutôt:

Code : Tout sélectionner

GUI.Label (new Rect (20, 300, 150, 30), textFieldString);
"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
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: Incompréhension avec GUI.changed

Message par jmhoubre » 21 Avr 2020 21:41

Bonsoir,
Qu'affiche le label?
Est-il bien positionné? Je veux dire, ne serait-il pas caché derrière un élément?
initialement, le label affichait "Etiquette". J'ai supprimé la ligne pour être sur que S (="Bouton 1 2 ou 3") ne s'affichait pas derrière.
Le second label, celui dans le if (GUI.changed), n'affiche rien.
D'après la doc, le text de l'inputfield devrait être renvoyé dans lui-même. Ici tu l'affectes à textFieldString. J'en déduis donc que la variable est remise à zéro (vidée). Donc sa valeur est renvoyée dans textFieldString.
Doc: Text to edit. The return value of this function should be assigned back to the string as shown in the example.
Je suppose que tu parles de la variable s ? J'ai mis un Debug.Log après GUI.TextField, s vaut bien "Bouton 1".
J'ai d'abord cru que mon switch n'allait pas, j'ai ajouté un Debug.Log. J'ai ensuite ajouté un autre controle GUI, TextField, qui fonctionne également.

J'ai essayé ta variante, cela ne change rien. J'ai enlevé la ligne "textFieldString = GUI.TextField (new Rect (20, 110, 150, 30), s);", puisqu'elle fonctionne.
Pour résumer, on entre bien dans le if (GUI.changed), le switch affecte correctement s en fonction de la partie de la toolbar cliquée, mais GUI.Label ne se modifie pas. Ce qui est peut-être normal ? C'est quand même une simple étiquette, dont la documentation précise que :
Labels have no user interaction, do not catch mouse clicks and are always rendered in normal style.

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

Re: Incompréhension avec GUI.changed

Message par boubouk50 » 22 Avr 2020 12:06

Je n'ai jamais touché à cela mais c'est peut-être simplement un pb d'algo.
Ici le GUI.Label est appelé qu'une seule fois, lors du changement d'état de GUI (GUI.changed) donc n'est créé que sur une seule frame.
Il faudrait sortir le Label de cette condition pour qu'il soit rafraîchi à chaque frame dans le OnGUI ().
Il te faudrait donc définir un booléen d'affichage pour le label qui devient vrai dans la condition.
"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
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Incompréhension avec GUI.changed

Message par boubouk50 » 22 Avr 2020 12:11

Je pense à quelque chose comme ça. Je n'ai pas testé.

Code : Tout sélectionner

using UnityEngine;

public class GUITest : MonoBehaviour {

	private string textFieldString;
	private string [] toolbarStrings = { "Barre d'outils 1", "Barre d'outils 2", "Barre d'outils 3" };
	private int selectedToolbar = 0;
	private bool displayLabel = false;
	private string labeltext = "";

	void OnGUI () {
		// TextFieldString.
		textFieldString = GUI.TextField (new Rect (20, 110, 150, 30), textFieldString);

		// Toolbar.
		selectedToolbar = GUI.Toolbar (new Rect (20, 230, 300, 30), selectedToolbar, toolbarStrings);

                // Label
                if (displayLabel)
		      GUI.Label (new Rect (20, 300, 150, 30), labeltext);
	
		// Détection des changements avec GUI.changed.
		if (GUI.changed) {
			if (selectedToolbar >= 0 && selectedToolbar < 3)
				labeltext = "Bouton " + (selectedToolbar+1).ToString ();

			
			// Affiche le changement.
			Debug.Log (labeltext);
			textFieldString = GUI.TextField (new Rect (20, 110, 150, 30), labeltext);
			displayLabel = true;
		}
	}
}
"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
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: Incompréhension avec GUI.changed

Message par jmhoubre » 22 Avr 2020 17:41

Merci pour toutes ces pistes.

1) Dans le code complet, GUI.Label est appelé bien avant le if, mais quand même dans OnGUI (). J'en avais même mis 2, avec un texte différent : les 2 étiquettes se superposent (moins facile à lire du coup :aille: ).

2) J'ai également essayé avec une variable, et en enlevant les accents du texte à afficher. Juste pour éliminer tous les cas auxquels j'ai pu penser. GUI.Label a bien fonctionné.

3) Et là, miracle, quand je clique sur la Toolbar, le label se met à jour :ghee: X( Bizarre... :pleur4:
Ce n'est pas l'accent qui pose problème, mais la 1ère affectation au label était "Étiquette". Là, j'affecte s, qui vaut également "Étiquette".

Je ne sais pas trop quoi en penser. F12 ne donne accès qu'à la définition de Label et ses surcharges. J'ai regardé sur internet, mais je n'ai rien trouvé.
Il se pourrait qu'Unity considère qu'affecter "Du texte entre guillemets" en fait une espèce de constante.

Du coup ta proposition aurait fonctionné, puisque ton 1er GUI.Label affecte une variable. Bravo ! :super: Merci !
Si tu te demandes à quoi cela va me servir, "A rien, c'était pour faire avancer le schimili ... Le schblilimi..."
Dans l'immédiat, je le met dans mes notes, et je poursuis la lecture de la documentation. Image

Répondre

Revenir vers « L'interface GUI »