[DB-AL] increment decrement onClick

Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

[DB-AL] increment decrement onClick

Message par lauraneb » 18 Juin 2017 20:50

Bonjour à tous
toujours tres débutante, j'ai codé une fonction qui incremente ou decremente un champ texte au click d'un bouton. Le code ne présente pas d'erreur selon Unity pourtant je ne comprends pas pourquoi il me donne des chiffres abérrants et pourquoi il ne garde pas le score dans le champs (il se remet à zero à chaque nouvelle scession). ce code est attaché a des gameobjects differents.

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LikeAction : MonoBehaviour {
    // déclaration des variables
    public Text scoreText;
    public int score;
    public Button LikeButton;
    public Sprite like;
    public Sprite unlike;

    void Start()
    {
        scoreText.text = "Cotation : " + score;
        LikeButton.enabled = true;
        LikeButton.image.sprite = like;
    }

        
        void Update () {
        LikeButton.onClick.AddListener(TaskOnClick);
        scoreText.text = "Cotation : " + score;
        }

    void TaskOnClick()
    {
        if (LikeButton.image.sprite =like)
        {
            score++;
            LikeButton.image.sprite = unlike;
            //scoreText.text = score.ToString();
        }
        else
        {
            score--;
            LikeButton.image.sprite = like;
            //scoreText.text = score.ToString();
        }
    }

}

merci pour vos reponses et vos explications

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: [DB-AL] increment decrement onClick

Message par Greg » 18 Juin 2017 23:40

coucou,
le listener dans l'update doit le rajouter en boucle, l'ajouter une fois dans le start devrait suffire.
J'ai pas testé, mais je pense ça c'est bon :

Code : Tout sélectionner

    void Start()
    {
        LikeButton.enabled = true;
        LikeButton.image.sprite = like;
        
        // Add listener to button only once.
        LikeButton.onClick.AddListener(TaskOnClick);
    }

    void Update()
    {
        // Assign current counter value at each frame.
        scoreText.text = "Cotation : " + score.ToString();
    }
Pour sauvegarder des données entre les sessions, il faut utiliser le PlayerPref.

voir Persistence saving and loading data :cote:

:merci:
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: [DB-AL] increment decrement onClick

Message par lauraneb » 19 Juin 2017 11:20

je vais essayer ça et je te tiens au courant.
alors pour le coup il incremente bien de 1 quand je clique sur le bouton la premiere fois. par contre il m'incremente encore de 1 quand je reclique sur le bouton alors qu'il devrait decrementer de 1. mais du coup j'ai pu detecter un autre probleme, c'est que le score affiché est le meme pour tous les objets : si je clique sur le bouton score du gameobject A le champ scoretext affiche 1 pour le gameobject A mais aussi pour tous les autres gameobjects qui sont liés au script.

en fait le score est lié à l'objet cliqué, il n'est pas dépendant du player mais du gameobject cliqué. Or comme un champ texte une fois rempli restitue les données quelques soit le player ou la scession, je me suis dis que le champ scoretext devrait reagir pareil. Or il remet le champs à zero à chaque scession.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 3921
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB-AL] increment decrement onClick

Message par boubouk50 » 19 Juin 2017 11:49

lauraneb a écrit :

Code : Tout sélectionner

...
    void TaskOnClick()
    {
        if (LikeButton.image.sprite =like)
        {
...
Attention a utiliser le bon signe: Un seul = correspond à une affectation, deux == correspond à une comparaison.
Ici, tu affectes le sprite like à ton bouton au lieu de tester. Il te faut donc mettre deux signes ==.
Egalement, en terme de lisibilité (voire d'opti), tu pourrais tester un booléen au lieu du sprite, la comparaison n'est pas la même en terme de performance.
De plus, comme ton bouton fonctionne comme un switch, il n'a que deux états alternés, ce qui est l'utilité même du booléen.
Exemple:

Code : Tout sélectionner

...
private boolean isButtonOn = true;

 void Start()
    {
        scoreText.text = "Cotation : " + score;
        LikeButton.enabled = true;
        LikeButton.image.sprite = like;
        isButtonOn = true;
    }
    
...

void TaskOnClick()
    {
        if (isButtonOn)
        {
            score++;
            LikeButton.image.sprite = unlike;
            //scoreText.text = score.ToString();
        }
        else
        {
            score--;
            LikeButton.image.sprite = like;
            //scoreText.text = score.ToString();
        }
    }
...
"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

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: [DB-AL] increment decrement onClick

Message par lauraneb » 19 Juin 2017 12:11

je reconnais mon oublie pour le =. ça fait plus de sens avec deux.
Boubouk50 et avec ta methode il n'y a pas besoin de passer à false le isbuttonOn dans le if ??? tels que je comprends le code, il sera toujours à true et donc incrementera le scoretext de +1 à chaque fois.
tu me diras, la mienne fait pas mieux pour l'instant ;)

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: [DB-AL] increment decrement onClick

Message par Greg » 19 Juin 2017 12:42

si...

Code : Tout sélectionner

    void TaskOnClick()
    {
        if (isButtonOn)
        {
            score++;
            LikeButton.image.sprite = unlike;
            isButtonOn = false;
        }
        else
        {
            score--;
            LikeButton.image.sprite = like;
            isButtonOn = true;
        }
    }
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 3921
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB-AL] increment decrement onClick

Message par boubouk50 » 19 Juin 2017 12:54

Oubli... :roll: Je voulais le sortir de la condition pour l'exemple.
Merci Greg

Code : Tout sélectionner

void TaskOnClick()
    {
        if (isButtonOn)
        {
            score++;
            LikeButton.image.sprite = unlike;
        }
        else
        {
            score--;
            LikeButton.image.sprite = like;
        }
        //Le changement d'état peut être sorti de la condition également
         isButtonOn = !isButtonOn;
    }
"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

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: [DB-AL] increment decrement onClick

Message par lauraneb » 20 Juin 2017 12:58

avec vos apports la fonction est active. merci à vous.
toute fois il y a un mecanisme que je ne comprends pas :
J'ai créé un script qui est attaché aux gameojects cliquables et qui restitue l'information de cet objet. Celui ci redonne bien l'information de l'objet cliqué et les informations sont toujours restituées quelque soit la scession de jeu. Ce qui veut dire qu'elles sont bien stockées quelque part. j'ai cru que c'était dans les champs.

Or dans le cas de ce bouton like le script est aussi attaché au gameobject. je pensais donc que le like se ferait bien sur le gameobject cliqué et que champ scoretext garderait en le resultat. Or si je clique sur le bouton like d'un gameobject, le score obtenu est appliqué à tous les objets. Et si je demarre une nouvelle scession, le score text revient à zero. ce qui me laisse à penser qu'en réalité le champ ne stocke pas l'info....

du coup j'ai du mal a comprendre pourquoi dans ce cas la le resultat n'est pas renvoyé entre les scession et qu'il s'agit d'un score global non attaché à l' objet cliqué.... sans comprendre ce principe je me rends compte que je pourrais que tres difficilement aller plus en avant dans mon projet

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 3921
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB-AL] increment decrement onClick

Message par boubouk50 » 20 Juin 2017 13:25

Je ne suis pas sur de bien comprendre.
Ici, seul le score est lié au script. L'affichage du score est lié au Text scoreText et l'interaction liée au bouton LikeButton. Ainsi, ti tu possèdes un seul bouton LikeButton et que tous tes scripts font appel à lui, alors il ira redistribuer tout à tout le monde, pareil pour l'affichage du score.
Tu t'y prends à l'envers. Dans ton cas, c'est le bouton qui doit récupérer les infos du GameObject cliqué et pas l'inverse. Sinon le bouton ne sait pas qui l'appelle.

Code : Tout sélectionner

LikeButton.onClick.AddListener(TaskOnClick);
Cette ligne ajoute au bouton une action au clic de celui-ci. Si tous les gameObjects ont pour variable de bouton ce même bouton, alors il aura en interaction une action pour chaque gameObject. Ainsi un clic activera toutes ses actions, donc appellera TaskOnClick () pour chacun des gameObjects.
Tu veux que le bouton ne fasse l'action que pour un seul gameObject, il faut donc qu'il sache lequel appeler. Il ne faut donc pas qu'il ait toutes les actions enregistrées. Il faut que l'information du gameObject sélectionné soit enregistrée pour que le bouton appelle la fonction TaskOnClic () de ce gameObject seulement.
"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

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: [DB-AL] increment decrement onClick

Message par lauraneb » 20 Juin 2017 15:01

en fait ce n'est n'y plus n'y moins qu'un bouton like/unlike pour les objets dans la scene (et non lié au joueur).
le champ scoreText est sur chaque gameobjects cliquables afin qu'il donne le total des clics qu'il y a eu sur le likebutton pour cet objet. j'ai attaché le script au gameobjects sur lesquels je voulais cette fonction. le bouton lui est dans le menu.

et si je te comprends bien, mon erreur vient du fait qu'il applique le script à tous les objects car c'est en fait toujours le meme quelque soit l'objet : meme script sur des objets differents activé par un meme bouton donne un meme resultat pour tous les objets.

toujours si je comprends bien ce que tu me dis, il faudrait que le script sache sur quel objet je suis pour differencier le scoretext. ou que ce script est fait pour calculer les click sur le bouton et devrait etre attaché au bouton et qu'il faut creer un autre script qui sera lui attaché au gameobject et qui donne la valeur contenu dans scoretext pour chaque object. Mais ou stocke t'il cette valeur ?

Répondre

Revenir vers « (C#) CSharp »