[Résolu]Problème de comparaison de réponses dans un formulaire Unity (InputFields et Prefabs))

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

[Résolu]Problème de comparaison de réponses dans un formulaire Unity (InputFields et Prefabs))

Message par 1300vrtical » 31 Oct 2023 12:18

Bonjour à tous,

Je travaille actuellement sur un projet dans Unity où je mets en place un système de formulaire pour que les joueurs puissent entrer des réponses textuelles. Cependant, je rencontre un problème lors de la comparaison des réponses entrées par les joueurs avec les réponses possibles dans mon jeu.

J'utilise TextMeshProUGUI pour capturer les réponses du joueur, et le texte est stocké dans un objet instance(clone). Je récupère le texte entré par le joueur à l'aide du code suivant :

Code : Tout sélectionner

	public void CreateValidate_instance()
	{
		for (int i = 0; i < currentMessageGroup.validation.Length; i++)
		{
			GameObject GOvalidations_i = Instantiate(GOvalidations, ReponceContent); 
			GOvalidations_i.transform.SetSiblingIndex(0);
			// renplissage des textes
			ValBoxElement valBoxElement = GOvalidations_i.GetComponent<ValBoxElement>();
			valBoxElement.presText = currentMessageGroup.validation[i].PresText;
			
			// je recherche le bouton de validation et lui ajoute une fonction sur bouton 
			Button buttonVal = GOvalidations_i.transform.Find("Validationmel").GetComponent<Button>();
			int index = i;
			buttonVal.onClick.AddListener(() => SetNextGroupVal(index));
		}
	}
puis dans :

Code : Tout sélectionner

	public void SetNextGroupVal(int indexVal)
	{
		// Récupérez le texte de la réponse du joueur depuis le formulaire de linstance creer juste avant
			GameObject TextJoueur = GameObject.Find("TextJ");
			Debug.Log("TextJ " + TextJoueur);
			string reponseJoueur = TextJoueur.GetComponent<TextMeshProUGUI>().text;
			Debug.Log("la réponse du joueur : "+reponseJoueur);
			Debug.Log("Longueur du texte de réponse du joueur : " + reponseJoueur.Length);

		if (currentMessageGroup != null && indexVal >= 0 && indexVal < currentMessageGroup.validation.Length)
		{
			bool reponseCorrecte = false;

			for (int j = 0; j < currentMessageGroup.validation[indexVal].BonneProposition.Length; j++)
			{
				string bonneProposition = currentMessageGroup.validation[indexVal].BonneProposition[j];

				if (reponseJoueur == bonneProposition)
				{
					reponseCorrecte = true;
					break;
				}
			}

			if (reponseCorrecte)
			{
				// Réponse correcte, affichez un message de succès
				GameObject newAnswerContent = Instantiate(answerContentPrefab, messagesContent);
				newAnswerContent.transform.SetSiblingIndex(0);
				newAnswerContent.GetComponentInChildren<Text>().text = currentMessageGroup.validation[indexVal].reponce;

				currentMessageGroup = currentMessageGroup.validation[indexVal].nextGroupVal;

				GOvalidations.gameObject.SetActive(false);
				StartCoroutine(SendingMessages());
			}
			else
			{
				// Réponse incorrecte, affiche un des message d'échec
				// Ici, vous pouvez gérer la réponse incorrecte comme vous le souhaitez
				Debug.Log("Réponse incorrecte.");
			}
		}
		else
		{
			Debug.LogError("IndexVal hors des limites du tableau : " + indexVal);
		}
	}

J'ai vérifié que l'objet TextJoueur est correctement trouvé et que le texte entré par le joueur est stocké dans reponseJoueur.
e problème survient lorsque j'essaie de comparer reponseJoueur avec les réponses possibles dans mon jeu. J'ai mis en place une boucle pour parcourir les réponses possibles, mais la comparaison ne fonctionne pas comme prévu. J'obtiens souvent une réponse incorrecte, même lorsque le texte entré par le joueur correspond à l'une des réponses possibles.
mon Debug.Log de la string reponseJoueur et toujours vide.
Y a-t-il quelque chose que je rate dans le button de validation? Peut-être que cela a quelque chose a faire avec onEndEdit.AddListener qui semble plus approprier ?Je tourne en rond et peut etre qu'un regard exterieur pouras m'aider a y voir plus claire :amen:
Si quelqu'un a déjà rencontré un problème similaire ou a des conseils pour résoudre cette situation, je serais reconnaissant pour toute aide que vous pourriez fournir.

Merci d'avance pour votre assistance.

Cordialement,
1300vrtical :merci:
Dernière édition par 1300vrtical le 03 Nov 2023 15:38, édité 1 fois.
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

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

Re: Problème de comparaison de réponses dans un formulaire Unity (InputFields et Prefabs))

Message par Max » 31 Oct 2023 16:17

Hello,

je n'ai pas regardé en profondeur ton code, mais il semble que tu effectues les comparaisons sur tes chaines (string)
en passant par l'opérateur d'égalité (==). Ça il faut éviter.
Il existe des fonctions dédiées au traitement des string. Par exemple dans ton cas regarde du coté de la méthode String.Compare, cela devrait déjà établir une base plus seine pour ce que tu cherches à faire.
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

Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: Problème de comparaison de réponses dans un formulaire Unity (InputFields et Prefabs))

Message par 1300vrtical » 31 Oct 2023 21:46

Bonjour,

Je tiens à vous remercier pour votre précieux conseil concernant l'utilisation de String.Compare pour comparer les chaînes de caractères. Je suis sur le coups :cote:
Cependant, j'ai toujours un défi que je n'arrive pas à résoudre. Mon problème principal réside dans le fait que je n'arrive pas à récupérer correctement les réponses écrite par le joueur depuis l'objet "TextJ" pour le comparer au bonnes réponses . J'ai tenté plusieurs approches pour obtenir les réponses entrées par le joueur, mais je rencontre des difficultés à chaque tentative. :aille:

L'objet "TextJ" semble être correctement trouvé par le debug.log, mais la récupération du texte entré par le joueur pose problème. :rouge: J'ai essayé d'utiliser TextJ.GetComponent<TextMeshProUGUI>().text pour obtenir le texte, mais cela ne semble pas fonctionner comme prévu. Je dois sûrement avoir un problème de logique que je ne comprends pas.
Merci pour toutes aide supplémentaire ou des suggestions sur la manière de récupérer correctement les réponses du joueur depuis un objet "TextJ" au moment de la validation dans Unity.
Merci d'avance pour votre soutien.

1300
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

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

Re: Problème de comparaison de réponses dans un formulaire Unity (InputFields et Prefabs))

Message par Max » 01 Nov 2023 10:45

Bonjour,

en fait je dois t'avouer que je ne comprends pas comment tu captes le texte entré par l'utilisateur, niveau interface UI ?
Tu évoques TextMeshProUGUI , mais cette classe sert essentiellement à l'affichage et non à effectuer des entrés (contrairement à TMP_InputField par exemple)
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

Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: Problème de comparaison de réponses dans un formulaire Unity (InputFields et Prefabs))

Message par 1300vrtical » 01 Nov 2023 18:21

J'ai récemment modifié le type de variable de mon champ de texte de TextMeshPro (TextMeshProUGUI) en InputField_TMP :oops: je suis confus, car je le savais déjà. Cependant, malgré mes efforts, je n'arrive toujours pas à faire passer le texte entré par l'utilisateur vers ma fonction SetNextGroupVal :aille2: . Voici le code que j'ai actuellement :

Code : Tout sélectionner

GameObject TextJoueur = GameObject.Find("InputField (TMP)");
TMP_InputField TextJoueur_Input = TextJoueur.GetComponent<TMP_InputField>();
TextJoueur_Input.onEndEdit.AddListener((string reponse) => SetNextGroupVal(index, TextJoueur_Input.text));
Mon problème principal est que je ne comprends pas pourquoi cette approche ne fonctionne pas comme prévu. Je ne reçois aucune erreur, mais je n'arrive pas à obtenir le texte entré par l'utilisateur dans mon prefab pour la fonction de comparaison SetNextGroupVal. :triste1:
Merci d'avance pour votre aide. :merci:
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: Problème de comparaison de réponses dans un formulaire Unity (InputFields et Prefabs))

Message par 1300vrtical » 03 Nov 2023 15:37

Bonjour,
J'ai trouvé mon erreur car j'utilisais un inputField (TMP) trop général alors que j'aurais dû le renommer de manière plus précise. :mdr1:
Merci pour l'aide apportée Max
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

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

Re: [Résolu]Problème de comparaison de réponses dans un formulaire Unity (InputFields et Prefabs))

Message par Max » 03 Nov 2023 18:03

Salut, et désolé pour cette réponses tardive :triste1:
Mais je vois que tu sembles avoir trouvé la solution de ton coté, donc c'est parfait ;)
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

Répondre

Revenir vers « Scripting »