[RESOLU]un compteur d'item sur un interface

Questions à propos du GUI, y compris la partie script.
poupoule_h5n1
Messages : 29
Inscription : 28 Nov 2022 20:24

[RESOLU]un compteur d'item sur un interface

Message par poupoule_h5n1 » 28 Nov 2022 22:55

Bien le bonjour,
voici mon interface :
Image
Très basique vous en conviendrez mais suffisant pour un petit rpg sans grande ambition (je débute ^^).
Dans le cadre d'une quête "trouve tout les panneau dans la forêt", j'aimerais pouvoir afficher sous celui-ci un inventaire rudimentaire dans lequel viendra s'afficher le nombre de panneau trouvé.
Hors me voila bloquée pour une raison idiote, j'arrive sans problème à masquer un items mais je ne trouve pas la formulation pour changer le nombre d'item.
Image
Ma solution par défaut serait de créer 10 items différent (avec leurs nombre dessus) et de les afficher les un à la suite des autres. Même si ce n'est évidement pas optimisé, ça fonctionnerait.

Mais je viens donc demander ici si vous pourriez m'aider à débloquer cette situation.
Si vous avez besoin de plus d'informations je reste à l'écoute :)
Dernière édition par poupoule_h5n1 le 29 Nov 2022 20:15, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5886
Inscription : 28 Avr 2014 11:57
Localisation : Allériot (71)

Re: un compteur d'item sur un interface

Message par boubouk50 » 29 Nov 2022 10:06

Salut,
Le message d'erreur est explicite, il contient même la réponse : There is no <TextMesh> attached to the "nombre" gameObject. etc.
-> Il n'y a pas de Component TextMesh sur le gameObject appelé nombre. Vous devriez ajouter un component TextMesh à ce gameObject.

Soit ton gameObject à un autre type de text (TextMeshProUGUI par ex) soit tu as posé ton script sur le mauvais objet.
Dans l'idée, tu as la solution: Ajouter un component qui vient modifier le texte.

Pour t'aider plus précisément, il nous faut le component de texte associé à ton gameObject nombre.
"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

poupoule_h5n1
Messages : 29
Inscription : 28 Nov 2022 20:24

Re: un compteur d'item sur un interface

Message par poupoule_h5n1 » 29 Nov 2022 11:34

Merci de prendre du temps pour aider une débutante :coeur:
pour créer le chiffre sur le panneau j'ai fait un clic gauche dessus dans la hiérachie, je suis allée dans UI, puis dans Text -TextMeshPro.

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

Re: un compteur d'item sur un interface

Message par jmhoubre » 29 Nov 2022 13:19

Bonjour,

dans le bout de code affiché dans le screen, tu mets à jour le component text avec "Hello World", mais le screen ne montre que la scène et pas la fenêtre game, pas possible de conclure. De plus il ne semble pas être mis à jour avec ton nombre d'item quelque part. Il devrait y avoir quelque part une ligne comme :

Code : Tout sélectionner

GetComponent<TextMesh>().text = ItemNumber.ToString();
De plus, tu utilises un composant TextMeshPro, il devrait y avoir

Code : Tout sélectionner

using TMPro;
et tu dois utiliser

Code : Tout sélectionner

TMP_Text text = GetComponent<TMP_Text> ();
Si j'ai bien compris ta question, tu cherches à afficher à l'écran, sur l'icone de panneau en bois, le nombre de panneaux trouvés dans le cadre d'une quête. Voici alors une solution :
1) créer un GameObject "Panel" avec un BoxCollider2D, et la case Trigger activée. Ajouter le script Panel :

Code : Tout sélectionner

using UnityEngine;
using TMPro;

public class Panel : MonoBehaviour
{
	// Le champ est statique, donc commun à toutes les instances de Panel.
	public static int FoundPanels;

	[SerializeField] private TMP_Text foundPanels;

	private void OnTriggerEnter2D (Collider2D collision)
	{
		if (collision.CompareTag ("Player"))
		{
			// Met à jour le nombre de panneaux trouvés.
			FoundPanels++;
			// Met à jour l'UI.
			foundPanels.text = FoundPanels.ToString ();
			// Détruit le panneau au bout de 1/2 seconde.
			Destroy (gameObject, 0.5f);
			// Désactive le panneau.
			gameObject.SetActive (false);
		}
	}
}
2) Faire un prefab avec ce GameObject, placer le prefab dans la scène.

3) Vérifier que le joueur a bien un tag "Player", avec Collider2D et RigidBody2D

4) Dans le Canvas, ajouter et positionner un champ texte TextMeshPro. Vérifier que tous les panneaux placés dans la scène ont bien le champ foundPanels renseigné (il y a plus pratique comme façon, mais il faut passer par un délégué).

J'ai fait un petit test : c'est bon.

poupoule_h5n1
Messages : 29
Inscription : 28 Nov 2022 20:24

Re: un compteur d'item sur un interface

Message par poupoule_h5n1 » 29 Nov 2022 20:11

Image
Hum...
Malheureusement quelque chose ne fonctionnait pas en l'état,
voici le message d'erreur qu'il m'affiche :
NullReferenceException: Object reference not set to an instance of an object
UnityEditor.Graphs.Edge.WakeUp () (at <8114aacb458543f0950a244ad87770c8>:0)
UnityEditor.Graphs.Graph.DoWakeUpEdges (System.Collections.Generic.List`1[T] inEdges, System.Collections.Generic.List`1[T] ok, System.Collections.Generic.List`1[T] error, System.Boolean inEdgesUsedToBeValid) (at <8114aacb458543f0950a244ad87770c8>:0)
UnityEditor.Graphs.Graph.WakeUpEdges (System.Boolean clearSlotEdges) (at <8114aacb458543f0950a244ad87770c8>:0)
UnityEditor.Graphs.Graph.WakeUp (System.Boolean force) (at <8114aacb458543f0950a244ad87770c8>:0)
UnityEditor.Graphs.Graph.WakeUp () (at <8114aacb458543f0950a244ad87770c8>:0)
UnityEditor.Graphs.Graph.OnEnable () (at <8114aacb458543f0950a244ad87770c8>:0)

J'ai mis un debug log pour voir.

Code : Tout sélectionner

using UnityEngine;
using TMPro;

public class Panel : MonoBehaviour
{
    // Le champ est statique, donc commun à toutes les instances de Panel.
    public static int FoundPanels;

    [SerializeField] private TMP_Text foundPanels;

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {
            Debug.Log("ok");
            // Met à jour le nombre de panneaux trouvés.
            FoundPanels++;
            // Met à jour l'UI.
            foundPanels.text = FoundPanels.ToString();
            // Détruit le panneau au bout de 1/2 seconde.
            Destroy(gameObject, 0.5f);
            // Désactive le panneau.
            gameObject.SetActive(false);
        }
    }
}
ça m'a appris que la collision ne se faisait pas

j'ai donc utiliser une autre méthode pour détecter la colision

Code : Tout sélectionner

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

public class Panel : MonoBehaviour
{
    // Le champ est statique, donc commun à toutes les instances de Panel.
    public static int FoundPanels;

    [SerializeField] private TMP_Text foundPanels;

    void OnTriggerEnter2D(Collider2D other)
    {
        PoupouleControle controller = other.GetComponent<PoupouleControle>();
        if (controller != null)
        {
            Debug.Log("ok");
            // Met à jour le nombre de panneaux trouvés.
            FoundPanels++;
            // Met à jour l'UI.
            foundPanels.text = FoundPanels.ToString();
            // Détruit le panneau au bout de 1/2 seconde.
            Destroy(gameObject, 0.5f);
            // Désactive le panneau.
            gameObject.SetActive(false);
        }
    }
}
El la ça marche :)
(même si l'étrange message d'erreur est toujours présent)
merci pour votre aide et pour le temps que vous m'avez accordé pour régler mon problème

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

Re: [RESOLU]un compteur d'item sur un interface

Message par jmhoubre » 29 Nov 2022 21:37

De temps en temps, les messages d'erreur concernent Unity. En cas de doute, faire clear dans la console. Les éventuels messages restant concernent ton travail.
Autre méthode plus radicale, sauver la scène et le projet, et relancer Unity.

Pour la collision, j'imagine que tu avais bien mis un tag Player sur Poupoule ?

poupoule_h5n1
Messages : 29
Inscription : 28 Nov 2022 20:24

Re: [RESOLU]un compteur d'item sur un interface

Message par poupoule_h5n1 » 30 Nov 2022 00:12

non je ne l'avais pas fait, c'est une mécanique que je ne connaissais pas, mais maintenant je me suis renseignée et du coup je comprends mieux pourquoi la collision ne se faisait pas.
Je patauge un peu dans le code, j'ai taper mes première ligne de code en c# il y a une semaine et je n'ai aucune formation la dedans, j'ai appris les bases avec un tuto. :gene:
Enfin, du coup, je vais continuer mon petit RPG. On verra bien ce que ça donnera ^^

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

Re: [RESOLU]un compteur d'item sur un interface

Message par jmhoubre » 30 Nov 2022 00:28

En fait, la collision se faisait, mais le code dans le if (dont ton debug.log) n'était pas exécuté.

Je te conseille d'aller voir ce sujet, qui est fait pour les débutants.

En particulier cette playlist, en français, qui devrait te donner toutes les bases.

Bon courage.

Répondre

Revenir vers « L'interface GUI »