[RESOLU] [MY - AL] problème script EDITOR et sauvegarde variable

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
djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

[RESOLU] [MY - AL] problème script EDITOR et sauvegarde variable

Message par djulio74 » 04 Mai 2020 17:04

Salut la compagnie!
Bon je viens vers vous pour surement un problème tout bête mais que je n'arrive pas a résoudre.
Le topo :
Je suis en train d'explorer les cripts EDITOR donc qui fonctionnent sans mettre le jeux en play. c'est pour faire un éditeur de niveau ( Pour un des projet de EmileF et par la même me remttre sur Mon mouton un peu con.
Je suis donc partis d'un projet vierge, créé un script EDITOR :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System;

[CustomEditor(typeof(Editeur))]
public class MainEditeur : Editor
{
    Editeur main;
    private void OnEnable()
    {
        main = ((Editeur)target).GetComponent<Editeur>();
        Tools.hidden = true;
    }
    private void OnDisable()
    {
        Tools.hidden = false;
    }
    void OnSceneGUI()
    {
        Handles.BeginGUI();

        if (GUI.Button(new Rect(10, 30, 120, 18), "reset"))
        {
            main.test1 = new Editeur.TEST[100];
        }
        Handles.EndGUI();
        Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
        RaycastHit hit;       

        if (Physics.Raycast(ray, out hit, Mathf.Infinity))
        {
            Handles.color = Color.green;

            int PosX = Mathf.RoundToInt(hit.point.x);
            int PosY = Mathf.RoundToInt(hit.point.y);
            int PosZ = Mathf.RoundToInt(hit.point.z);

            Vector3 Pos = new Vector3(PosX, PosY, PosZ);

            Handles.RectangleHandleCap(0, Pos, Quaternion.LookRotation(Vector3.up), 0.5f, EventType.Repaint);

            if (Handles.Button(hit.point, Quaternion.LookRotation(Vector3.up), 0.0f, 0.0f, Handles.RectangleHandleCap))
            {
                
                main.test1[PosX + PosZ * 10].ok = !main.test1[PosX + PosZ * 10].ok;
            }
        }
        Handles.color = Color.red;
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if (main.test1[i + j * 10].ok == true)
                {
                    Handles.DrawLine(new Vector3(i, 0, j), new Vector3(i, 0, j)+ Vector3.up * 2);
                }
            }
        }
    }
}
C'est un script tout simple pour faire des tests, notement modifier un array de struct défini dans ce script :

Code : Tout sélectionner

using UnityEngine;
using System;

public class Editeur : MonoBehaviour 
{

    [Serializable]
    public struct TEST
    {
        public bool ok;
        public int essai;
    }

    [SerializeField]
    public TEST[] test1;

    private void Start()
    {
        Debug.Log(test1.Length);
    }
}
Donc dans l'absolu tout fonctionne bien. Quand je sélectionne mon objet avec le dernier script dans la hierarchie, mon éditeur se met bien en place, j'arrive bien a modifier les bool du struc à l'index voulu.
Dans l'inspecteur, le valeur sont bien modifiées, je debug même un drawRay dans la scène pour vérifier.
Mais si je sauvegarde la scène et quitte Unity , à l'ouverture mes valeur modifiées ne sont pas conservées. Il faut que j'en modifie une manuellement dans l'inspecteur pour que toutes soient sauvegardées ce qui est pas forcément pratique.

Ma question est : ou est-ce que je fait de travers?
J'ai fait package pour ceux qui voudront tester (une scene et deux scripts)
D'avance merci si quelqu'un me trouve la solution :super:
Dernière édition par djulio74 le 04 Mai 2020 17:46, édité 1 fois.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: [MY - AL] problème script EDITOR et sauvegarde variable

Message par Max » 04 Mai 2020 17:26

Hello,
De mémoire, regarde du coté EditorUtility.SetDirty(target);.
(là, j'ai pas mon ordi sous la main)
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

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [MY - AL] problème script EDITOR et sauvegarde variable

Message par djulio74 » 04 Mai 2020 17:41

Chapeau l'ami, exactement ce qu'il me fallait !!! :super: :super: :super:
J'ai testé et nickel, vais pouvoir avancer.
Reste plus qu'a faire quelques test savoir s'il faut le faire a chaque changement ou pas. mais là j'ai testé pour pour chaque changement de valeur et ça fonctionne tip top!

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « (C#) CSharp »