[RESOLU] [DB-AL] Sauvegarde de gameobjects avec playerprefs

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
Auréane
Messages : 15
Inscription : 05 Sep 2017 10:10

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par Auréane » 05 Sep 2017 16:25

J'ai essayé d'utiliser ma fonction DestroySaveable mais ça a fait planter unity >< mais je ne l'avait pas utilisée comme ça
Du coup je recommence les scripts à partir de 0 pour essayer de les simplifier et de mieux comprendre le tuto.

DontDestroyOnLoad ne fonctionne pas dans ce cas car je ne veux pas l'avoir pour toutes les scène mais uniquement celle-ci.

Et je n'avais pas touché à cette ligne de code ^^"
Dans le tuto tout va bien pour lui mais je ne sais pas pourquoi il ne veut pas pour moi
Enfin ça fonctionne mais l'erreur empêche unity de faire exactement ce que je lui demande : je m'explique, dans son tuto, le gars récupère les variables des objets que l'on veut sauvegarder dans la scène, jusque là tout va bien.

Puis il ajoute cette fameuse ligne de code qui permet d'instancier de nouveaux objets aux endroits précédemment enregistrés
(C'est ce que j'ai compris du tuto) dans le tuto à ce moment il a 3fois le même objet à des endroits différents alors que moi je n'en ai qu'un sur deux (car je veux en sauvegarder 2) et il me met cette erreur.


Dans un moment de désespoir j'ai fermé et rouvert unity et là ça a marché, plus d'erreur, mais quelques heures après rebelote.

Donc je ne comprend pas ^^"

J'ai trouvé un scripts intéressant dans le forum, j'essayais de le comprendre et de m'en inspiré mais c'est encore trop compliqué pour moi d'où le fait que je recommence le tuto ^^"
Dernière édition par Auréane le 05 Sep 2017 16:41, édité 2 fois.

Auréane
Messages : 15
Inscription : 05 Sep 2017 10:10

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par Auréane » 05 Sep 2017 16:34

Une autre chose que j'avais essayé de faire aussi, c'était de mettre le playerprefs dans la fonction que j'utilise pour le bouton pour sauvegarder en même temps que l'on appuis, mais j'avais lu sur d'autres forum qu'il fallait absolument convertir le gameobject en string pour pouvoir le sauvegarder.

Du coup j'ai chercher dans ce sens et c'est comme ça que je suis tombée sur ce tuto.

C'est un peu compliqué même si c'est dit accessible aux débutants mais c'est le seul que j'ai trouvé ^^"

Boubouk m'a bien expliqué les bases de playerprefs (je l'en remercie grandement) mais je suis très visuelle alors j'ai du mal à visualiser ce que je fais si je fais pas de schéma au préalable x)
et comme la "conversion en string obligatoire" sonne toujours dans ma tête j'ai du mal à savoir ce que je dois mettre dans les valeurs si je veux faire un PlayerPrefs.SetInt() et comment unity fait pour comprendre que c'est un gameobject qu'on lui demande de sauvegarder


Et pour sauvegarder sur une longue durée j'ai utilisé OnApplicationQuit () et ça avait marché

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

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par boubouk50 » 05 Sep 2017 18:51

boubouk50 a écrit :
05 Sep 2017 14:21
Score ou autre, c'est le même principe. Tu sauvegardes une donnée: int, float ou string.
Attention, tu ne sauvegardes pas un GameObject. Tu sauvegardes une donnée de type entier, flottant ou chaîne de caractère. ce n'est pas pareil.
C'est la clé utilisée qui va te servir de repère. Et comme déjà dit, tu peux utilisé le nom du gameObject, il faut donc qu'il soit unique.
Ton gameObject sera toujours le même, il ira simplement chercher une donnée. Et en fonction de cette donnée, il va faire ce qu'il veut.
Par exemple, si tu veux que ton bouton soit désactivé si la géo-cache est trouvée, lors du Start () de ton level, il ira chercher le PlayerPrefs associé (clé = nom) qui sera un entier. Cette donnée récupérée, tu peux ensuite faire une condition de type: si la variable de PlayerPrefs == 1 (ou null si tu n'as pas initialisé), alors activé sinon désactivé.
Ensuite, il te faut enregistrer cette valeur si la cache est trouvée, donc lorsque l'utilisateur clique sur ton bouton, celui-ci va affecter le PlayerPrefs dont la clé sera son nom. (Ne pas oublier de faire un Save () également)
Aussi, simple que cela.
Si tu veux stocker autre chose qu'un entier/flottant/string, il ne faut pas utiliser les PlayerPrefs.
"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

Auréane
Messages : 15
Inscription : 05 Sep 2017 10:10

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par Auréane » 06 Sep 2017 08:37

D'accord je comprend mieux comme ça

Merci encore Boubouk de prendre le temps de m'expliquer :D

Je vais essayer comme ça c'est plus simple que le code du tuto ^^

Auréane
Messages : 15
Inscription : 05 Sep 2017 10:10

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par Auréane » 06 Sep 2017 09:14

Grâce à boubouk j'ai fais un nouveau script et j'en suis là :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class saveScript : MonoBehaviour {

    int trouvee = 1;

    public GameObject trouveeButton;


    // Use this for initialization
    void Start () {

        PlayerPrefs.SetInt("trouvee", trouvee);

        trouveeButton.SetActive(false);

    }
	


	// Update is called once per frame
	void Update () {

        PlayerPrefs.GetInt("trouvee", trouvee);

        if (trouvee == 1)
        {
            trouveeButton.SetActive(true);
        }
        else
        {
            trouveeButton.SetActive(false);
        }

    }



    public void Save()
    {
        PlayerPrefs.SetInt("trouvee", trouvee);
    }



}
J'ai donc mon bouton qui est bien enregistré dès le Start() en tant qu'actif
Je pense avoir loupé un petit truc car il ne se désactive pas lorsque l'on clique dessus ^^"

Mais au moins je comprend mieux comment ça fonctionne ^^

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

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par boubouk50 » 06 Sep 2017 09:42

Y'a encore un peu de boulot tout de même...

Ton bouton est un événement, tu n'as pas besoin de l'activer ou le désactiver à chaque frame. Pour info, l'Update () est appelé à chaque frame au cas où.
Pourquoi le désactiver dès le départ? Comment l'actives-tu? Que fais le bouton? Ici tout est statique, ton bouton sera toujours actif, il te manque le changement d'état.

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class saveScript : MonoBehaviour {

    //Il est trouvé dès le départ? sinon 0
    private int trouvee = 0;
    private bool estTrouvee = false;

    public GameObject trouveeButton;

    // Use this for initialization
    void Start () {
	//Ici, il faut tenir compte du playerPrefs s'il a déjà été enregistré - Comment vas-tu différencier les différentes clés si tu mets une string?
	if (PlayerPrefs.HasKey (trouveeButton.name))
        	trouvee = PlayerPrefs.GetInt(trouveeButton.name);
        else {
        	trouvee = 0;
        	PlayerPrefs.SetInt(trouveeButton.name, trouvee);
        }
        
        //Ici si trouvee == 1 alors true, sinon false;
        estTrouvee = (trouvee == 1);
        
        //Veux-tu désactiver le bouton ou seulement son interaction (grisé)?
        trouveeButton.SetActive(estTrouvee ); //ou trouvee.GetComponent <Button> ().enabled = estTrouvee ;

    }
	//Update totalement inutile, des calculs pour rien

	//A quoi ça sert? --> Si trouvee n'est pas affecté, alors ça ne changera pas
    public void Save()
    {
        PlayerPrefs.SetInt(trouveeButton.name, trouvee);
        PlayerPrefs.Save (); //Penser à sauvegarder
    }

//Ou est l'interaction avec le bouton?

}
"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

Auréane
Messages : 15
Inscription : 05 Sep 2017 10:10

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par Auréane » 06 Sep 2017 10:07

Je voudrais que le bouton vert soit caché au début et qu'il n'y ai que le bouton noir

Et lorsque l'on appuis sur le bouton noir le bouton vert apparaisse et le bouton noir disparaisse ^^

Mais j'aimerais que si le bouton noir est actif qu'il soit enregistré comme actif, mais lorsque c'est le bouton vert c'est lui qui doit être actif d'où mon utilisation de playerprefs

au tout début de mon code j'avais fait ça comme fonction pour activé/désactivé les boutons :

Code : Tout sélectionner

 public void OnMouseDown()
    {
        Debug.Log("bouton Vert");
        buttonNonTrouve.SetActive(false);

        buttonTrouvee.SetActive(true);
        
        //ici c'était un texte qui apparaissait en même temps que le bouton vert
        texteCacheTrouve.SetActive(true);

    }
    
mais je l'avais retiré lorsque j'ai commencé le tuto

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

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par boubouk50 » 06 Sep 2017 10:39

Donc tu veux switcher entre 2 gameObjects? C'est encore plus simple alors. Puisque tu enregistres un entier, il sera donc l'index de ton tableau.

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class saveScript : MonoBehaviour {

    //index du bouton noir
    private int trouvee = 0;

    //Ici dans l'inspector tu rempliras ton tableau avec les 2 boutons: le noir en 0 et le vert en 1
    public GameObject[] boutons;

    // Use this for initialization
    void Start () {
	//Ici, il faut tenir compte du playerPrefs s'il a déjà été enregistré - Comment vas-tu différencier les différentes clés si tu mets une string?
	if (PlayerPrefs.HasKey ("boutonCache"))
        	trouvee = PlayerPrefs.GetInt("boutonCache");
        else {
        	trouvee = 0;
        	PlayerPrefs.SetInt("boutonCache", trouvee);
        }
        
        //Active le bouton qui a l'index du playerPrefs et désactive l'autre
       boutons [trouvee].SetActive (true);
       boutons[1-trouvee].SetActive (false);
    }

    public void SavePlayerPrefs (int _value)
    {
    	trouvee = _value;
        PlayerPrefs.SetInt("boutonCache", trouvee);
        PlayerPrefs.Save (); //Penser à sauvegarder
        
       //Active le bouton qui a l'index du playerPrefs et désactive l'autre
       boutons [trouvee].SetActive (true);
       boutons[1-trouvee].SetActive (false);
    }

}
Il te manque donc l'affectation de la variable trouvee. Ton bouton noir doit appeler la fonction SavePlayerPrefs () avec une valeur à 1 et le vert avec la valeur 0. Ce sera à mettr edans le OnClick () du bouton dans l'Inspector
"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

Auréane
Messages : 15
Inscription : 05 Sep 2017 10:10

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par Auréane » 06 Sep 2017 11:29

Merci c'était exactement ce que je voulais !!

Et imaginons je veux que, si le bouton vert est activé, un autre gameobject dans une autre scène soit activé aussi et soit actif tant que le bouton vert est activé

Je dois utiliser un GetComponent pour savoir si le bouton vert est bien actif?

Désolé j'abuse encore un peu de ton temps après promis je m'en vais ^^

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

Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs

Message par boubouk50 » 06 Sep 2017 11:33

Non, l'activation est liée au gameObject: gameObject.SetActive (x).
Donc il faut récupérer le GameObject du bouton.
"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

Répondre

Revenir vers « (C#) CSharp »