[RESOLU] [DB-AL] Sauvegarde de gameobjects avec playerprefs
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] Sauvegarde de gameobjects avec playerprefs
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 ^^"
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.
Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs
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é
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é
- boubouk50
- ModoGenereux
- Messages : 6222
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs
D'accord je comprend mieux comme ça
Merci encore Boubouk de prendre le temps de m'expliquer
Je vais essayer comme ça c'est plus simple que le code du tuto ^^
Merci encore Boubouk de prendre le temps de m'expliquer
Je vais essayer comme ça c'est plus simple que le code du tuto ^^
Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs
Grâce à boubouk j'ai fais un nouveau script et j'en suis là :
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 ^^
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);
}
}
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 ^^
- boubouk50
- ModoGenereux
- Messages : 6222
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs
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 :
mais je l'avais retiré lorsque j'ai commencé le tuto
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);
}
- boubouk50
- ModoGenereux
- Messages : 6222
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs
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.
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
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);
}
}
"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] Sauvegarde de gameobjects avec playerprefs
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 ^^
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 ^^
- boubouk50
- ModoGenereux
- Messages : 6222
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Sauvegarde de gameobjects avec playerprefs
Non, l'activation est liée au gameObject: gameObject.SetActive (x).
Donc il faut récupérer le GameObject du bouton.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation