[DB-AL] Problème pour que mon perso récolte du bois

Modérateurs : Administrateurs Suppléants, Community Manager

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
Platypuss
Messages : 13
Inscription : 07 Juil 2019 20:30

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par Platypuss » 10 Juil 2019 21:06

Je vous remercie tous pour votre aide, j'ai trouver et corrigé les beug !!!!!!! :-D

Platypuss
Messages : 13
Inscription : 07 Juil 2019 20:30

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par Platypuss » 22 Juil 2019 19:30

Bonjour, j'ai un nouveau problème:

voici le code:

Code : Tout sélectionner

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

public class Aff_Ress : MonoBehaviour {

    public Text woodtext;
    public Text rocktext;

    int number = 1;

    private int wood;
    private int rock;

    string Wood;
    string Rock;

    void Start () {

        Ressources Ressourcewood = new Ressources();
        Ressources Ressourcerock = new Ressources();

        wood = Ressourcewood.Wood = 10000;
        rock = Ressourcerock.Rock = 10000;

        Wood = wood.ToString();
        Rock = rock.ToString();
    }

    void Update()
    {
        while (number > 0)
        {
            woodtext.text = "wood : " + Wood;
            rocktext.text = "rock : " + Rock;
        }
    }
}

Et le problème, c'est que j'aimerais que le nombre de ressource se mette a jour tout le temps (c'est pour ça le while)
Mais le problème, c'est que quand je lance mon jeu, et ben il crash ! Pas d'erreur dans la console, et si j'enlève le while ça marche !

Vous avez une Solution ??? :faché:

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7257
Inscription : 30 Juil 2011 13:57

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par Max » 22 Juil 2019 20:44

Bonsoir,

Tu es dans le cas d'une boucle infinie, qui plus est dans un Update. D'où le crash, un classique.
Il faut vraiment que tu ais bien en tête le rôle de chaque fonction. Par exemple Update est appelé à chaque frame (donc 60 fois par seconde si ton jeu est à à 60 fps). Donc les Whiles dans les Updates, il faut oublier.
En suite, pourquoi mettre en permanence tes textes à jour ? Tu ne dois mettre à jour tes éléments que lorsqu'il y a un changement d'état de wood ou rock. Il suffit donc à ce moment de mettre à jour les woodtext.text et rocktext.text, élement qui ne sont pas "volatiles" et qui vont garder l'information jusqu’à une prochaine mise à jour.

Et accessoirement attention, tu nommes des données avec le même nom, à la seule différence de la première lettre (majuscule/minuscule) comme Wood et wood. Crois moi, y-a pas pire comme source de confusion et niveau relecture du code.
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

Platypuss
Messages : 13
Inscription : 07 Juil 2019 20:30

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par Platypuss » 22 Juil 2019 22:40

Du coup, je fais comment ?

Je ne sais pas faire ça :gene:

Moi 1971
Messages : 711
Inscription : 29 Sep 2015 13:38

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par Moi 1971 » 23 Juil 2019 08:24

Bonjour,
et bien tu fais comme te l'a dit Max. Tu enlèves le while() puisqu'il est inutile. Tu veux un boucle infinie? Update() est une boucle infinie!
Donc :

Code : Tout sélectionner

void Update()
    {
            woodtext.text = "wood : " + Wood;
            rocktext.text = "rock : " + Rock;
     }
Ce code là fonctionne mais comme l'a dit Max, il ne faut pas faire comme ça.
Il faut que tu fasses une fonction " de mise à jour visuelle " qui sera appelée quand la quantité de ressource changera.
La dyslexie n'a rien à voir avec l'illettrisme.

EmileF
Messages : 394
Inscription : 18 Mars 2017 19:39

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par EmileF » 23 Juil 2019 09:53

Salut,

dans ton cas j'utilise les propriétés exemple

Code : Tout sélectionner

    int wood;
    private int Wood
    {
        get { return wood; }
        set
        {
            wood = value;
            woodtext.text = "wood : " + wood.ToString();
        }
    }

et tu peux faire la même chose pour "rock". Ainsi plus besoin de Update, et tu gères l'affichage à chaque fois que tu modifies "Wood" attention avec une Majuscule.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Platypuss
Messages : 13
Inscription : 07 Juil 2019 20:30

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par Platypuss » 23 Juil 2019 16:18

Merci, mais ça ne marche pas.

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

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par boubouk50 » 23 Juil 2019 16:35

Platypuss a écrit :
23 Juil 2019 16:18
Merci, mais ça ne marche pas.
Si ce code fonctionne.

Si on répondait comme toi, tu n'irais pas très loin...
Qu'as-tu fais pour que cela ne fonctionne pas. Il ne suffit pas de le copier-coller, il faut aller l'utiliser au sein d'un code. Montre nous l'utilisation que tu en as faite et on te répondra pourquoi tu n'arrives pas à le faire fonctionner.
Si tu attends un code prêt à l'emploi, ce n'est pas trop t'aider et ce n'est pas le principe ici, même si on t'a déjà bien mâcher le travail.
"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

Platypuss
Messages : 13
Inscription : 07 Juil 2019 20:30

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par Platypuss » 23 Juil 2019 19:19

J'ai changé le code, car la récupération des variables wood et rock depuis le script Ressources, mais cela ne marche
toujours pas:

Code : Tout sélectionner



    public Text woodtext;
    public Text rocktext;

    private int wood = 10000;
    private int rock = 10000;



    //Améliorer le Castle

    private int woodNeedForCastle = 100;
    private int rockNeedForCastle = 100;

    public GameObject cl1;
    public GameObject cl2;

    private int Level_Castle = 1;

    public void UpCastleToLevel2()
    {
        if (wood >= woodNeedForCastle && rock >= rockNeedForCastle && Level_Castle == 1)
        {

            wood = wood - woodNeedForCastle;
            rock= rock - rockNeedForCastle;

            woodNeedForCastle = woodNeedForCastle + 100;
            rockNeedForCastle = rockNeedForCastle + 100;

            Level_Castle = Level_Castle + 1;
            print("Château amélioré !");

            cl1.SetActive(false);
            cl2.SetActive(true);

        }
    }

    //Améliorer la Forge

    private int woodNeedForForge = 50;
    private int rockNeedForForge = 50;

    public GameObject fl1;
    public GameObject fl2;

    private int Level_Forge = 1;

    public void UpForgeToLevel2()
    {
        if (wood >= woodNeedForForge && rock >= rockNeedForForge && Level_Forge == 1)
        {

            wood = wood - woodNeedForForge;
            rock = rock - rockNeedForForge;

            woodNeedForForge = woodNeedForForge + 10;
            rockNeedForForge = rockNeedForForge + 10;

            Level_Forge = Level_Forge + 1;
            print("Forge amélioré !");

            fl1.SetActive(false);
            fl2.SetActive(true);
        }
    }

    //Afficher le nombre de ressources

    private int Wood
    {
        get { return wood; }
        set
        {
            wood = value;
            woodtext.text = "wood : " + wood.ToString();
        }
    }

    private int Rock
    {
        get { return rock; }
        set
        {
            rock = value;
            rocktext.text = "rock : " + rock.ToString();
        }
    }

}
Voilà Voilà :-D

Avatar de l’utilisateur
Alesk
Messages : 2037
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [DB-AL] Problème pour que mon perso récolte du bois

Message par Alesk » 23 Juil 2019 19:44

ça ne fonctionne pas car tu n'as pas bien saisi l'utilité des getter/setter


tu as d'un côté ta variable "wood"

Code : Tout sélectionner

private int wood = 10000;
et de l'autre ta variable "Wood" avec un W majuscule

Code : Tout sélectionner

private int Wood
    {
        get { return wood; }
        set
        {
            wood = value;
            woodtext.text = "wood : " + wood.ToString();
        }
    }
Alors déjà, comme on te l'a déjà précisé, c'est une très mauvaise idée de n'avoir qu'une majuscule pour différencier deux variables.
De plus, les règles d'écriture du code dans unity indiquent que les variables commencent toujours par des minuscules et les fonctions toujours par des majuscules, ce n'est en rien obligatoire, mais ça aide à s'y retrouver.

Ensuite, pour en venir au fonctionnement, le fait de déclarer le set/get sur Wood implique que lorsque tu vas modifier ou récupérer le contenu de cette variable (qui est donc stocké dans wood), les fonctions get ou set seront exécutées.

Pour simplifier, la variable déclarée avec le get/set (Wood) sert uniquement de pont vers la valeur qui est réellement stockée dans ta variable "originale" (wood)

Là on observe dans ton code que tu ne bosses que sur wood, et non Wood. Donc la fonction set de Wood n'est jamais exécutée... et donc il ne se passe pas ce que tu désires.

Pour que ça fonctionne, il faut donc changer :

Code : Tout sélectionner

wood = wood - woodNeedForCastle;
en

Code : Tout sélectionner

Wood = Wood - woodNeedForCastle;
ou

Code : Tout sélectionner

Wood -= woodNeedForCastle;
qui est plus "propre"

Comme c'est Wood qui doit être utilisée dans les opérations courantes et que wood est une version "cachée", il vaut mieux changer ta nommenclature pour y voir plus clair:
wood devient _wood, par exemple
Wood devient wood

Ainsi, il y aura moins de chances de confusions à la relecture du code.

Répondre

Revenir vers « (C#) CSharp »