SetActive a condition que

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
RenNoun
Messages : 8
Inscription : 19 Août 2020 13:07

SetActive a condition que

Message par RenNoun » 22 Août 2020 04:22

Bonjour,

Pour commencer je tiens a dire que mon niveau en programmation est très limité car je débute complètement même si j'essaye de progresser.
Voilà, c'est pas vraiment un souci technique, mais plus un souci de logique et de propreté de code.
J'ai une scène 2D avec plusieurs sprite, sur les quels j'applique

Code : Tout sélectionner

void ChangeSprite(Sprite newSprite)
    {
        spriteRenderer.sprite = newSprite;

    }


void Start()
    {
        spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
    }


void OnMouseDown()
    {
        
        if (Input.GetMouseButtonDown(0))
        {
            ChangeSprite(newSprite);
            
        }
En gros si je clic sur le sprite, un nouveau sprite s'applique. Jusque la tout vas bien, le problème viens après


J'ai un bouton, et je veux que il s’active quand chaque sprite a eu le newSprite.
Pour celà je dois détecter le nombre de sprites dans la scene avec un count ce que j'ai fais c'est:

Code : Tout sélectionner

if (Input.GetMouseButtonDown(0))
        {
            ChangeSprite(newSprite);
            this.count++;
            if (this.count == this.stars)
            {
                this.button1.SetActive(true);
            }
        }

Et la le problème, c'est que si je clique 3 fois sur le même sprite, ça va me compter comme si j'avais cliqué sur les autres sprites et donc le bouton s'acctive.

Moi ce que je voudrais, c'est que ça n'accepte que un clic par sprite pour que on soit obligé de cliquer sur les 3 sprites.

Voilà, si quelqu'un peut me proposer une idée plus intéressante que ce que j'ai, ça serait cool merci beaucoup pour votre temps :)


Voici le code complet que j'ai jusque maintenant

Code : Tout sélectionner

public SpriteRenderer spriteRenderer;
    public Sprite newSprite;
    public GameObject button1;
 

    public int stars = 0;
    public int count = 0;

    void constructor() {
        this.count = 0;
        this.stars = 0;
    }

    void ChangeSprite(Sprite newSprite)
    {
        spriteRenderer.sprite = newSprite;

    }

    void Start()
    {
        spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
    }

    private void Awake()
    {
        this.stars = GameObject.FindGameObjectsWithTag("star").Length;
    }

    // fonctionne que si l'on clic sur un gameobject avec mesh colider
    void OnMouseDown()
    {
        // Si on clic, l'ancien sprite est changé par un nouveau
        if (Input.GetMouseButtonDown(0))
        {
            ChangeSprite(newSprite);
            this.count++;
            if (this.count == this.stars)
            {
                this.button1.SetActive(true);
            }
        }
        

    }

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

Re: SetActive a condition que

Message par Max » 22 Août 2020 10:17

Bonjour,

Sur la forme, plusieurs choses concernant ton code.
- évite les "this." , ce n'est pas une erreur mais ce n'est pas une obligation (c'est implicite en fait) et cela nuit à la lisibilité de ton code.
- constructor, c'est quoi (n'est jamais appelé) ? Si ton objectif est de créer un Constructor, en théorie ce n'est pas la bonne façon de faire, de plus cela n'est pas permis dans une classe qui dérive de MonoBehaviour.
- dans ta fonction OnMouseDown(), tu rajoute un Input.GetMouseButtonDown(0) qui n'a pas de raison d'être, vue que le callback OnMouseDown() est appelé quand tu click sur le bouton gauche de la souris. Ne pas hésiter à lire la doc.

Après, sur le fond, ton script est appliqué à chaque sprite j'imagine. Donc tu ne peux pas gérer ton ensemble de sprites avec un script qui lui est destiné à gérer chaque sprite. Du moins il vaut mieux éviter. Tu dois essayer de créer un script qui va être en quelque sorte un gestionnaire de tes sprites, et c'est lui qui va détecter en fonction des informations qui vont lui être transmise que tu as atteint l'ensemble des changements de sprite avec un newsprite et enclencher les actions souhaitées dans ce cas.
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

RenNoun
Messages : 8
Inscription : 19 Août 2020 13:07

Re: SetActive a condition que

Message par RenNoun » 22 Août 2020 13:16

Max a écrit :
22 Août 2020 10:17
Bonjour,

Sur la forme, plusieurs choses concernant ton code.
- évite les "this." , ce n'est pas une erreur mais ce n'est pas une obligation (c'est implicite en fait) et cela nuit à la lisibilité de ton code.
- constructor, c'est quoi (n'est jamais appelé) ? Si ton objectif est de créer un Constructor, en théorie ce n'est pas la bonne façon de faire, de plus cela n'est pas permis dans une classe qui dérive de MonoBehaviour.
- dans ta fonction OnMouseDown(), tu rajoute un Input.GetMouseButtonDown(0) qui n'a pas de raison d'être, vue que le callback OnMouseDown() est appelé quand tu click sur le bouton gauche de la souris. Ne pas hésiter à lire la doc.

Après, sur le fond, ton script est appliqué à chaque sprite j'imagine. Donc tu ne peux pas gérer ton ensemble de sprites avec un script qui lui est destiné à gérer chaque sprite. Du moins il vaut mieux éviter. Tu dois essayer de créer un script qui va être en quelque sorte un gestionnaire de tes sprites, et c'est lui qui va détecter en fonction des informations qui vont lui être transmise que tu as atteint l'ensemble des changements de sprite avec un newsprite et enclencher les actions souhaitées dans ce cas.
Bonjour Max,

Merci pour tous ces conseils, C'est vrais que le constructor j'ai oublié de le supprimer quand j'ai vu que je ne pouvais rien faire. Et oui je vais chercher un moyen de créer un script qui interagit avec d'autres scripts. D'ailleurs si tu as une doccu sur la façon de créer un script gestionnaire de scripts, ça serait vraiment super bien pour moi.

Merci encore pour tes, conseils, je vais corriger mon script avant de passer à la suite.

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

Re: SetActive a condition que

Message par Max » 22 Août 2020 13:51

RenNoun a écrit :
22 Août 2020 13:16
D'ailleurs si tu as une doccu sur la façon de créer un script gestionnaire de scripts, ça serait vraiment super bien pour moi.

Merci encore pour tes, conseils, je vais corriger mon script avant de passer à la suite.
Il ne s'agit pas de créer un gestionnaire de script, mais un script qui va te permettre de gérer un ensemble de GameObjects et d'opérer certaines actions/changement en fonction du comportement de ceux-ci gérer par leur propre script.
Dans ton cas, il faut commencer par se pencher sur un des concepts de base, permettant des échanges/accès entre deux scripts. Exemple, si un de tes sprites effectue une action/changement, comment alerter le gestionnaire ?
Les sujets sur la communication entre scripts ne manquent pas sur le forum, c'est un sujet récurent.
Sinon, pour commencer doucement et par quelques bases, tu as ce genre de tuto (en français): https://www.youtube.com/watch?v=r5ZV9hHiI7o
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

RenNoun
Messages : 8
Inscription : 19 Août 2020 13:07

Re: SetActive a condition que

Message par RenNoun » 22 Août 2020 19:26

Max a écrit :
22 Août 2020 13:51
RenNoun a écrit :
22 Août 2020 13:16
D'ailleurs si tu as une doccu sur la façon de créer un script gestionnaire de scripts, ça serait vraiment super bien pour moi.

Merci encore pour tes, conseils, je vais corriger mon script avant de passer à la suite.
Il ne s'agit pas de créer un gestionnaire de script, mais un script qui va te permettre de gérer un ensemble de GameObjects et d'opérer certaines actions/changement en fonction du comportement de ceux-ci gérer par leur propre script.
Dans ton cas, il faut commencer par se pencher sur un des concepts de base, permettant des échanges/accès entre deux scripts. Exemple, si un de tes sprites effectue une action/changement, comment alerter le gestionnaire ?
Les sujets sur la communication entre scripts ne manquent pas sur le forum, c'est un sujet récurent.
Sinon, pour commencer doucement et par quelques bases, tu as ce genre de tuto (en français): https://www.youtube.com/watch?v=r5ZV9hHiI7o
Merci beaucoup Max, je suis allé m'acheter quelques livres sur le C# pour essayer d'apprendre avant de continuer, je pense que c'est mieux si je ne veux pas passer a côté de quelque chose de aussi basique ^^'.

Merci encore pour ton aide :)

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

Re: SetActive a condition que

Message par Max » 22 Août 2020 20:13

commencer par les base, c'est une sage décision, et on y gagne toujours au final ;)
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 »