[MY-AL] Création de sauvegardes

Pour les scripts écrits en C#
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
ZacLune
Messages : 9
Inscription : 22 Mars 2016 20:29

[MY-AL] Création de sauvegardes

Message par ZacLune » 13 Déc 2017 22:00

Bonjour à tous et à toutes !
Ca fait un petit bout de temps que je connait Unity et que je créé deux trois protos par çi par là, mais il y a peu je suis sortit de ma zone de confort et j'ai commencé à essayer de créer des sauvegardes !
J'ai suivi un tutoriel pour le script de SaveLoad, mais voilà : Je n'ai pas l'impression de faire bien les choses pour mon GameData, et d'ailleurs (je le dit honteusement :oops: ) je suis bloqué sur un classique "NullReferenceExeption" quand je veut récupérer une donnée de mon GameData avant même de l'avoir sauvegardé ! Si je ne me trompe pas, ce message d'erreur signifie que la données que j'essaie de récupérer est nulle... Mais je n'arrive pas à comprendre pourquoi.
Voilà mon script, je peut aussi vous donner le SaveLoad mais je doute qu'il serve, et je précise que j'ai effectué ces scripts dans une scène presque vide pour éviter les parasites.

Code : Tout sélectionner

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

public class TestTextSave : MonoBehaviour {

	void Update () {
		if (Game.current.gameName != null) // Le message d'erreur est ici sur le Game.current.gameName
			GetComponent<Text> ().text = Game.current.gameName;
		else
			GetComponent<Text> ().text = "Nouvelle Partie";
			
	}

	public void SaveTest() {
		Game.current.gameName = "Partie créée";
		SaveLoad.Save ();
	}

	public void ResetTest() {
		Game.current.gameName = "Nouvelle Partie";
		SaveLoad.Save ();
	}
}

Code : Tout sélectionner

using System.Collections;
using UnityEngine;

[System.Serializable]
public class Game {

	public static Game current;
	public int niveaux = 1;
	public string gameName = "Nouvelle Partie";

	public Game () {
		
	}

}
Merci de la réponse d'avance !
Image
Bonhomme qui marche...

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY-AL] Création de sauvegardes

Message par boubouk50 » 14 Déc 2017 10:30

Salut,

cette erreur signifie que tu essaies d'accéder à quelque chose contenu dans une référence nulle. Ce n'est pas simplement le fait que la référence soit nulle.
Donc ici, ce n'est pas gameName qui est en cause mais current.
Si current est null, tu ne peux pas accéder à gameName puisqu'il n'existe pas. Il te faut tester si current est null d'abord ou bien, tout simplement, l'initialiser avant.
"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

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: [MY-AL] Création de sauvegardes

Message par DevAmat » 14 Déc 2017 10:34

Code : Tout sélectionner

if (Game.current.gameName != null) // Le message d'erreur est ici sur le Game.current.gameName
Cela signifie Que Game.current est null. Ta variable static n'est pas initialisée dans le constructeur de ta class Game.
Pour l’initialiser:

Code : Tout sélectionner

public Game ()
{
	current = this;	
}

ZacLune
Messages : 9
Inscription : 22 Mars 2016 20:29

Re: [MY-AL] Création de sauvegardes

Message par ZacLune » 14 Déc 2017 20:11

Merci beaucoup pour vos réponses rapides et précises :-D mais dans mon cas ça n'a pas l'ai de marcher même en déclarant la classe comme ça :

Code : Tout sélectionner

public Game () {
		current = new Game();
	}
ou comme ça :

Code : Tout sélectionner

public Game () {
		current = this;
	}
Voulez vous plus de précision ?
Image
Bonhomme qui marche...

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

Re: [MY-AL] Création de sauvegardes

Message par Max » 14 Déc 2017 21:48

Bonsoir ZacLune,

Je crois que tu devrais regarder du coté des Singletons. C'est très certainement la solution la plus 'académique' qui conviendrait pour ce que tu cherches à faire. La doc ne manque pas sur le sujet.

Suivant les cas, il existe plusieurs variantes, mais le principe reste le même.
Dans ton cas, tout en essayant de coller à tes 'nommages', ta classe Game pourrait ressembler à quelque chose comme cela:

Code : Tout sélectionner

public class Game 
{
        public int niveaux = 1;
        public string gameName = "Nouvelle Partie";

    #region SINGLETON
        private static Game current; // en règle générale et par convention on utiliserait plutôt 'instance'

        private Game() { }

        public static Game Instance
        {
            get
            {
                if (current == null)
                {
                    current = new Game();
                }
                return current;
            }
        }
    #endregion
}
Dans TestTextSave.cs, tu aurais alors:

Code : Tout sélectionner

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

public class TestTextSave : MonoBehaviour {

	void Update () {
		if (Game.Instance.gameName != null) 
			GetComponent<Text> ().text = Game.Instance.gameName;
		else
			GetComponent<Text> ().text = "Nouvelle Partie";
			
	}
 ...etc......
}
à noter, que dans l'update, ton test 'if (Game.Instance.gameName != null)' va s’exécuter plusieurs dizaines de fois par secondes (60 fois/s si ton frame rate est calé à 60 fps), pas sûr que cela soit super tip top ;)
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

ZacLune
Messages : 9
Inscription : 22 Mars 2016 20:29

Re: [MY-AL] Création de sauvegardes

Message par ZacLune » 17 Déc 2017 22:58

Merci beaucoup ! Ça a l'air un peu complexe, je vais essayer de comprendre tout ça et le mettre en oeuvre. Je vous recontacterait si j'ai un autre problème ou si je suis arrivé à quelque chose de fonctionnel !
Image
Bonhomme qui marche...

ZacLune
Messages : 9
Inscription : 22 Mars 2016 20:29

Re: [MY-AL] Création de sauvegardes

Message par ZacLune » 17 Déc 2017 23:15

J'ai compris ! En effet c'est assez génial les Singleton...
Je conseille cette vidéo qui est juste géniale pour comprendre, et je revient dès que je l'ai mis en oeuvre sur mon projet !
https://youtu.be/CPKAgyp8cno
Image
Bonhomme qui marche...

Répondre

Revenir vers « (C#) CSharp »