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 :

Variables sur un MonoBehiavour reset après relancement Unity


Sujet :

Unity

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Variables sur un MonoBehiavour reset après relancement Unity
    Bonjour, J'ai un soucis et j'ai besoins de votre aide !
    J'ai réalisé un petit éditeur custom (WindowEditor) qui récupère un objet dans la scène par son nom et charge/modifie les valeurs de ses variables. Ça fonctionne très bien sauf que, lorsque je relance Unity, les variables du script attaché à l'objet sont reset. J'ai fais quelques tests : lorsque je modifie les valeurs directement dans l'inspector de l'objet la variable devient en gras et dans le panneau Hierarchy la scène a un * qui signifie qu'elle a besoins d'être sauvegardé. Lorsque je modifie une valeur au travers de mon éditeur, ça ne fait pas ça. J'ai pourtant essayé en faisant clic droit puis save sur la scène mais même avec ça les valeurs reviennent par défaut. L'objet instancié est un prefab je ne sais pas si ça peut venir de là... Quelques exemple de comment mon code est foutu (grossièrement) :

    Le script attaché à l'objet ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
     
    public class ScriptAttachedToTheObject : MonoBehaviour {
     
        public bool variable;
    }
    le script éditeur ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    using UnityEngine;
    using UnityEditor;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
     
    public class TheWindow: EditorWindow {
        public GameObject gameObject;
        public ScriptAttachedToTheObject scriptAttachedToTheObject ;
     
        [MenuItem("menublabla/blablabla")]
        private static void OpenWindow() {
            TheWindow window = GetWindow<TheWindow> ();
            window.titleContent = new GUIContent ("blablabla");
            window.minSize = new Vector2 (900, 500);
        }
     
        private void OnGUI() {
            // Où je modifie les valeurs de la façon "scriptAttachedToTheObject.variable = xx;
        }
     
        private void OnEnable() {
            gameObject = GameObject.Find ("TheObject").gameObject;
            scriptAttachedToTheObject = gameObject .GetComponent<ScriptAttachedToTheObject >();
        }
    }
    Une idée ? Merci !

  2. #2
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Salut, les assets on besoin d'être enregistrer comme "dirty" si il sont modifiés par le code, ils ne détectent pas automatiquement leurs changements.

  3. #3
    Membre habitué Avatar de EliXirr
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 62
    Points : 176
    Points
    176
    Par défaut
    Si l'objet que tu essais de modifier est un prefab tu dois "Brek prefab" afin que tes modifications soient enregistrées.

    En gros un prefab dans une scene va toujours (toujours !) garder les valeurs que tu lui a setter. Si tu veux le modifier tu dois le faire dans ton repertoire projet et non dans ta scene car les modifs ne seront pas pris en compte.

    pour casser ton prefab tu selectionne l'objet et tu vas dans la bare de menu : GameObject -> Break Prefab Instance.

    Après j'ai pas vraiment pigé pourquoi pour modifier un objet tu le faisait dans un EditorWidow mais bon tu dois avoir tes raisons

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    En effet j'avais trouvé la réponse en creusant pas mal hier soir, un gars propose je sais plus un un petit script qui permet de break le lien avec le prefab lorsqu'il est mis dans la scene (vu que mon controller englobe plusieurs scripts c'est mieux) enfin le fait que modifier des variables par mon editor ne permet pas au prefab de se "dissocier" comme il le fait lorsqu'on modifie directement la var dans l'inspector est un peu nul nul quand même mais bon... Et pour le dirty oui j'ai fini par trouvé que rajouter "using UnityEditor.SceneManagement;" et "EditorSceneManager.MarkAllScenesDirty ();" lorsque j’exécute une action qui demanderait à être sauvegardé permettait de forcer l'utilisateur à sauvegarder et donc de garder les variables...
    Enfin bon merci quand même j'espère que ce topic aidera d'autres personnes =)

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

Discussions similaires

  1. Problème de reset après validation
    Par zev dans le forum Struts 1
    Réponses: 4
    Dernier message: 01/06/2006, 13h42
  2. Variable nombre : arrondir à 5 chiffres après la virgule
    Par micatmidog dans le forum Général Python
    Réponses: 7
    Dernier message: 21/12/2005, 10h03
  3. Accès refusé sur un dossier partagé après formatage
    Par musicmandj5 dans le forum Windows XP
    Réponses: 4
    Dernier message: 02/10/2005, 18h19
  4. definir un nombre decimal sur 2 numero max apres la vergule
    Par nil dans le forum Bases de données
    Réponses: 5
    Dernier message: 25/02/2004, 21h49
  5. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23

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