[DB-AL] Problème pour que mon perso récolte du bois
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
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
Re: [DB-AL] Problème pour que mon perso récolte du bois
Je vous remercie tous pour votre aide, j'ai trouver et corrigé les beug !!!!!!!
Re: [DB-AL] Problème pour que mon perso récolte du bois
Bonjour, j'ai un nouveau problème:
voici le code:
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 ???
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 ???
Re: [DB-AL] Problème pour que mon perso récolte du bois
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.
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
Re: [DB-AL] Problème pour que mon perso récolte du bois
Du coup, je fais comment ?
Je ne sais pas faire ça
Je ne sais pas faire ça
Re: [DB-AL] Problème pour que mon perso récolte du bois
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 :
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.
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;
}
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
Salut,
dans ton cas j'utilise les propriétés exemple
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.
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();
}
}
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.
Re: [DB-AL] Problème pour que mon perso récolte du bois
Merci, mais ça ne marche pas.
- boubouk50
- ModoGenereux
- Messages : 6268
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Problème pour que mon perso récolte du bois
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Problème pour que mon perso récolte du bois
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:
Voilà Voilà
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();
}
}
}
Re: [DB-AL] Problème pour que mon perso récolte du bois
ç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"
et de l'autre ta variable "Wood" avec un W majuscule
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 :
en
ou
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.
tu as d'un côté ta variable "wood"
Code : Tout sélectionner
private int wood = 10000;
Code : Tout sélectionner
private int Wood
{
get { return wood; }
set
{
wood = value;
woodtext.text = "wood : " + wood.ToString();
}
}
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;
Code : Tout sélectionner
Wood = Wood - woodNeedForCastle;
Code : Tout sélectionner
Wood -= woodNeedForCastle;
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.