IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unity Discussion :

Question sur la portée des variables entre scènes [Unity 5]


Sujet :

Unity

  1. #1
    Membre averti Avatar de eliniel
    Femme Profil pro
    Ingénieure Essais et validation
    Inscrit en
    Septembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieure Essais et validation
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 115
    Points : 429
    Points
    429
    Par défaut Question sur la portée des variables entre scènes
    Bonjour à tous,

    Dans mon petit projet 2D, je dispose de 3 scènes:
    MainMenu
    Main (le jeu)
    Game over.

    Lorsque l'on commence le jeu, on a la fenêtre menu, on clique sur jouer, et cela lance la scène Main avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Loadlevel("Main")
    Problème:
    Les points de vie du personnages tombent à 0 quand le héros meurt ou quand il change de niveau. (donc GameOver forcé)
    Quand je lance directement la scène "Main", je n'ai pas ce problème. Le jeu marche très bien.
    J'en ai déduis que la variable des points de vie n'a pas la bonne "portée" si je lance la scène depuis la scène du menu.
    Pourquoi?
    J'ai essayé de passer la variable à static afin de conserver la valeur et cela marche. (j'ai lu que ce n'était pas une solution recommandée, y a-t-il des alternatives?)
    Le problème est alors qu'à la mort du personnage, la "scène écran" GameOver apparaît, renvoie au menu et lorsque l'on relance la partie, la variable des points de vie est à 0. (vu que sa précédente valeur était égale ou inférieure à 0)


    Ma variable de point de vie est déclarée comme ci-dessous dans le gestionnaire de jeu de la scène "Main".

    Peut-on garder la variable en et lui assigner la valeur par défaut lors de l'écran GameOver?
    J'ai bien essayé mais il ne la détecte pas quand je veux lui assigner une valeur.

    Si quelqu'un avait une explication à mon problème, ou une piste que je puisse essayer.
    Ingénieure essais validation

    J'essaye d'écrire du mieux que je peux.

  2. #2
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Bonsoir Altalya,

    Pour simplifier, pars du principe que toutes tes scènes sont toujours indépendantes (cela vaut évidement pour la partie script). Donc ce qui existe dans l'une sera totalement perdu quand tu en auras chargée une autre.
    Maintenant, il existe des moyens pour s’accommoder de ce problème.
    Tu peux, par exemple, créer un Player (ou un GameObject genre 'ManageGame') qui ne sera pas détruit entre chaque changement de scène. Voir pour cela une instruction comme DontDestroyOnLoad.
    Tu peux aussi procéder à la sauvegarde de certains élément pour les récupérer d'une scène à l'autre. Si les données ne sont pas trop nombreuses, PlayerPrefs peut-être une solution simple de mise en oeuvre.

  3. #3
    Membre averti Avatar de eliniel
    Femme Profil pro
    Ingénieure Essais et validation
    Inscrit en
    Septembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieure Essais et validation
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 115
    Points : 429
    Points
    429
    Par défaut
    Bonjour,

    J'avais déjà regarder cette histoire de Player.Pref sans trop comprendre cette histoire de clé.

    Cela veut dire que je devrais placer la variable HP, dans un script dans un GameObject, y faire référence dans mon script et faire DontdestroyOnLoad dessus?
    Ingénieure essais validation

    J'essaye d'écrire du mieux que je peux.

  4. #4
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Bonjour Altalya,

    Citation Envoyé par Altalya Voir le message
    J'avais déjà regarder cette histoire de Player.Pref sans trop comprendre cette histoire de clé.
    Il ne faut pas se soucier des histoire de clé en fait, c'est juste une sorte de tag qui te permet de retrouver tes petits dans les sauvegardes. L'utilisation des PlayerPrefs est des plus simple, c'est d'ailleurs le but, fournir une facilité de sauvegarde de data sans se prendre la tête. Tu pourrais écrire par exemple quelques chose comme PlayerPrefs.SetInt("PointdeVie", HP); avant de sortir du niveau et avant le load du suivant, puis tu récupèrerais dans le niveau suivant à l'init la valeur par HP = PlayerPrefs.GetInt("PointdeVie");.

    Citation Envoyé par Altalya Voir le message
    Cela veut dire que je devrais placer la variable HP, dans un script dans un GameObject, y faire référence dans mon script et faire DontdestroyOnLoad dessus?
    Si tu ne passes pas par un choix de sauvegarde translevel (genre PlayerPrefs comme évoque plus haut) alors oui, tu peux passer pas un gameobject contenant ton script et qui aura la possibilité de 'survivre' aux différents changement de niveaux, en le spécifiant explicitement par le biais d'un DontdestroyOnLoad sur ce gameobject. Ce gameobject serait créé dans ton niveau représentant ton menu intial (ou ton départ de jeux), et tu le verras apparaitre dans ta 'hierarchy' dans les autres niveaux, du fait de sa persistance programmée.

    J'espère ne pas avoir été trop confus dans mes explications.

  5. #5
    Membre averti Avatar de eliniel
    Femme Profil pro
    Ingénieure Essais et validation
    Inscrit en
    Septembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieure Essais et validation
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 115
    Points : 429
    Points
    429
    Par défaut
    Bonsoir,
    j'ai réessayé la méthode de Player.pref (+ un print HP) et il s'avère qu'il prend bien la valeur en mémoire mais elle n'est pas reconnue dans la scène.

    La variable HP est dans le script Player et je dois la garder dans mon GameManager qui se trouve dans la même scène.
    Même si la variable est en "public HP", il a fallut que je la redéclare pour éviter une erreur de script.
    Ingénieure essais validation

    J'essaye d'écrire du mieux que je peux.

  6. #6
    Membre averti Avatar de eliniel
    Femme Profil pro
    Ingénieure Essais et validation
    Inscrit en
    Septembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieure Essais et validation
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 115
    Points : 429
    Points
    429
    Par défaut
    En fait, je viens de comprendre le problème.
    En fait, à part mon problème de HP, quand je lance à partir de mon menu, je commence directement au niveau 2. (chose qui n'arrive pas si je lance juste le jeu)
    J'en ai donc déduis qu'il devait charger le niveau 1, puis directement le niveau 2. (mais pourquoi???)

    Du coup, j'obtiens ça pour les HP.
    100 HP quand on démarre le jeu
    Puis le reste à chaque niveau.

    Nom : img01.png
Affichages : 2368
Taille : 49,3 Ko

    Y-a-t-il un moyen de corriger ce problème ?
    Je pensais pourtant qu'avec PlayerPref, même s'il chargeait directement le niveau suivant (même scène), vu que le personnage n'a pas bougé, il devait garder la valeur en mémoire?
    Ingénieure essais validation

    J'essaye d'écrire du mieux que je peux.

  7. #7
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Bonjour Eliniel,

    J'avoue ne pas avoir tout compris sur tes chargements de niveau, n'ayant pas tous les éléments pour me faire une idée
    Ceci dit (et j'espère que cela t'éclairera mieux sur ce point), j'ai omis de préciser une chose concernant les PlayerPrefs, c'est qu'ils sont permanent. Je veux dire par la qu'une valeur mémorisée le reste, en dehors même de l’exécution de ton jeux. Si la dernière affectation était par exemple 85, alors le lendemain, au premier lancement de ton application, la valeur récupérée sera de nouveau 85. Donc en fonction de cela, ne pas oublier si nécessaire de faire les bons setting au démarrage de ton jeux si tu veux repartir au début avec des valeurs bien précises à chaque départ de jeux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. petite question bete sur : La portée des variables
    Par Guillaume_PRG dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/06/2012, 15h46
  2. Réponses: 4
    Dernier message: 05/08/2010, 11h05
  3. Une question sur le stockage des variables
    Par UnReveDeCryptomeria dans le forum C
    Réponses: 10
    Dernier message: 08/06/2006, 23h37
  4. Réponses: 4
    Dernier message: 04/06/2006, 16h53
  5. [FLASH 8] Question sur la portée des objets.
    Par i_shinji dans le forum Flash
    Réponses: 1
    Dernier message: 02/11/2005, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo