Bonjour,
Dans mon Projet j'ai 2 Scènes.
La scène 1 contient les objets A, B et C qui sont cachés par défaut.
Lorsque j'appuie sur une touche du clavier, alors les objets : A, B et C apparaissent dans la Scène 1.
J'accède maintenant à ma Scène 2.
Si je retourne dans ma Scène 1 alors les objets A, B et C sont invisibles.
Comment puis je faire en sorte qu'il soient visibles lors de mon retour de la Scène 2 ?
J'ai vu la fonction DontDestroyOnLoad mais cette fonctionne affiche les objets A, B et C lorsque je suis dans la Scène 2.
J'ai vu la fonction PlayerPrefs mais je ne comprends comment elle fonctionne.
Merci pour votre aide.
Garder des objets en mémoire de Scène en Scène
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
Garder des objets en mémoire de Scène en Scène
Dernière édition par kealkeal le 28 Oct 2015 11:31, édité 1 fois.
kealkeal
- boubouk50
- ModoGenereux
- Messages : 6265
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Garder des objets en mémoire de Scène en Scène
La fonction DontDestroyOnLoad() peut s'appliquer aussi à des GameObjects qui ne servent que de support de script.
Tu mets un script sur un gameObject vide qui gère les objets des différentes scènes. Quand ton objet A, B ou C s'affiche, ton script reçoit l'info et la conserve. Ensuite, quand vas et viens de scène en scène, à chaque Start () de ta scène tu vas vérifier l'état des tes objets A, B et C et tu fais en fonction.
Tu peux également utiliser les playerPrefs, il te faut enregistrer les états dans des variables et les récupérer également au Start (). Il te faut également gérer le cas du premier lancement.
PlayerPrefs est très simple à utiliser: tu fais un SetXX (nom de la donnée, valeur de la donnée) pour stocker une donnée, et un GetXX (nom de la donnée) pour la récupérer.
Tu mets un script sur un gameObject vide qui gère les objets des différentes scènes. Quand ton objet A, B ou C s'affiche, ton script reçoit l'info et la conserve. Ensuite, quand vas et viens de scène en scène, à chaque Start () de ta scène tu vas vérifier l'état des tes objets A, B et C et tu fais en fonction.
Tu peux également utiliser les playerPrefs, il te faut enregistrer les états dans des variables et les récupérer également au Start (). Il te faut également gérer le cas du premier lancement.
PlayerPrefs est très simple à utiliser: tu fais un SetXX (nom de la donnée, valeur de la donnée) pour stocker une donnée, et un GetXX (nom de la donnée) pour la récupérer.
"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: Garder des objets en mémoire de Scène en Scène
Euh ... ouais je vois bien l'idée ... mais le code à mettre en place ... c'est le brouillard
Saurais tu me faire un script simple pour que je puisse comprendre le principe.
PS : Je suis pas codeur ... CQFD mais je me soigne !!
Saurais tu me faire un script simple pour que je puisse comprendre le principe.
PS : Je suis pas codeur ... CQFD mais je me soigne !!
kealkeal
Re: Garder des objets en mémoire de Scène en Scène
Salut alors j'ai peut être une solution à te proposer. Par contre sa ressemble à du bricolage (oui j'aime beaucoup le bricolage^^').
Tu devrais essayer d'utiliser des variables booléennes publiques pour gérer l'activation ou la désactivation de tes objets:
Ensuite tu fais un test dans ton update() pour chaque booléen: si (activeA = true) alors (MonObjetA.enabled = true) sinon si (activeA = false) alors (MonObjetA.enabled = false).
Sauf erreur de ma part, le booléen public restera stocké même si tu sors de ta scène et quand tu reviens dedans il redonne l'état souhaité à ton objet.
Je n'ai pas encore testé cette méthode mais sa devrait marcher.
PS: mes variables sont déclarée pour du js, si tu utilise un autre langage, redéclare les ne fais pas un copier/coller
Tu devrais essayer d'utiliser des variables booléennes publiques pour gérer l'activation ou la désactivation de tes objets:
Code : Tout sélectionner
public var activeA: boolean = false;
public var activeB: boolean = false;
public var activeC: boolean = false;
Sauf erreur de ma part, le booléen public restera stocké même si tu sors de ta scène et quand tu reviens dedans il redonne l'état souhaité à ton objet.
Je n'ai pas encore testé cette méthode mais sa devrait marcher.
PS: mes variables sont déclarée pour du js, si tu utilise un autre langage, redéclare les ne fais pas un copier/coller
- boubouk50
- ModoGenereux
- Messages : 6265
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Garder des objets en mémoire de Scène en Scène
Oula du calme!
Bidouiller c'est sympa mais là, ça ne va pas du tout!
1/ l'Update () n'est pas un fourre tout! Il est appelé à chaque frame, donc à chaque frame il fait des calculs, donc il faut limiter le nombre de calculs inutiles. Vérifier l'état d'un booléen à chaque frame est inutile. Il faut une fonction qui change l'état au moment où on veut qu'il change
2/ Faites un peu de logique: Si B == true alors A = true sinon Si B == false alors A = false. Un booléen a 2 états, donc si c'est pas l'un c'est l'autre, on fait sauter la 2e condition avec un else. Vous pouvez aussi remarquer que dans les 2 cas A vaut B. Donc tout se résume à: A = B.
3/ Une variable publique est détruite entre chaque scène si l'objet qui possède le script est détruit, d'où la nécessité d'un DontDestroyOnLoad ()
Au Start () de ta scène, tu vas chercher l'état de tes objets -> booléen stocké ->
Faire une fonction qui change l'état de ton gameObject et qui stocke son état->
Et c'est tout!
Pour le booléen stocké, soit tu passes par une variable dans un script qui ne se détruit pas, initialisée avec l'état de départ, soit tu passes par les PlayerPrefs.
Bidouiller c'est sympa mais là, ça ne va pas du tout!
1/ l'Update () n'est pas un fourre tout! Il est appelé à chaque frame, donc à chaque frame il fait des calculs, donc il faut limiter le nombre de calculs inutiles. Vérifier l'état d'un booléen à chaque frame est inutile. Il faut une fonction qui change l'état au moment où on veut qu'il change
2/ Faites un peu de logique: Si B == true alors A = true sinon Si B == false alors A = false. Un booléen a 2 états, donc si c'est pas l'un c'est l'autre, on fait sauter la 2e condition avec un else. Vous pouvez aussi remarquer que dans les 2 cas A vaut B. Donc tout se résume à: A = B.
3/ Une variable publique est détruite entre chaque scène si l'objet qui possède le script est détruit, d'où la nécessité d'un DontDestroyOnLoad ()
Au Start () de ta scène, tu vas chercher l'état de tes objets -> booléen stocké ->
Code : Tout sélectionner
MyGameObject.SetActive (booléen stocké).
Code : Tout sélectionner
MyGameObject.SetActive (!MyGameObject.activeSelf);
booléen stocké = MyGameObject.activeSelf //va voir la doc pour le activeSelf
Pour le booléen stocké, soit tu passes par une variable dans un script qui ne se détruit pas, initialisée avec l'état de départ, soit tu passes par 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: Garder des objets en mémoire de Scène en Scène
Ok merci pour l'info Boubouk, c'est vrai que j'en suis encore à l'étape bidouillage mais j'espère bien progresser d'ici quelques semaines en jetant un oeil à un maximum de sujets.