Page 2 sur 3

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

Publié : 10 Juil 2019 21:06
par Platypuss
Je vous remercie tous pour votre aide, j'ai trouver et corrigé les beug !!!!!!! :-D

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

Publié : 22 Juil 2019 19:30
par Platypuss
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é:

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

Publié : 22 Juil 2019 20:44
par Max
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.

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

Publié : 22 Juil 2019 22:40
par Platypuss
Du coup, je fais comment ?

Je ne sais pas faire ça :gene:

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

Publié : 23 Juil 2019 08:24
par Moi 1971
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.

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

Publié : 23 Juil 2019 09:53
par EmileF
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.

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

Publié : 23 Juil 2019 16:18
par Platypuss
Merci, mais ça ne marche pas.

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

Publié : 23 Juil 2019 16:35
par boubouk50
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.

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

Publié : 23 Juil 2019 19:19
par Platypuss
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

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

Publié : 23 Juil 2019 19:44
par Alesk
ç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.