EditorWindow : Extern Data et Instance

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
Haseo
Messages : 2
Inscription : 12 Mars 2015 12:40

EditorWindow : Extern Data et Instance

Message par Haseo » 12 Mars 2015 13:11

Salut,

M'amusant avec les EditorWindow je me posait une petite question. Est-il possible de récupérer les valeurs (visuel) d'une classe pour les utiliser depuis un EditorWindow se trouvant dans une autre class ?

Voyons cela comme un Hub si je peux dire cela ainsi. L'EditorWindow MonEditeurWindow serait le centre et par appels, lui greffer des données ! Je vais faire un petit code rapide pour montrer l'idée.

PS : Etant au boulot, le code ci-dessous est écrit à la levé, normalement il n'y a pas d'erreur je pense.

Code : Tout sélectionner

using UnityEditor;
using UnityEngine;

class WindowTest : EditorWindow
{

    private string titleCn1;

    [MenuItem("Window/WindowTest", false, 801)]
    private static void Init()
    {
        WindowTest windowMManager = EditorWindow.GetWindow<WindowTest>(typeof(WindowTest));
        windowMManager.title = "Title Window";
    }

    private void OnEnable()
    { }

    private void OnGUI()
    {
        // Du contenu normal
        EditorGUILayout.BeginHorizontal();
        {
            GUILayout.Button("#Button");
        }
        EditorGUILayout.EndHorizontal();

        // Du contenu Dynamique
        OtherContent();
    }

    private void OtherContent()
    {
        //... Charger du Contenu existant dans une autre classe (classe de stockage ?)
        if (titleCn1 == "Content 1")
        {

        }
        else if (titleCn1 == "Content 2")
        {

        }
        // Etc Etc (bon ce sont des conditions simples pour l'exemple)
    }
}
C'est l'idée du Hub dont je parlais, un seul EditorWindow pour des données variés et gérable à souhait. Et du coup, travailler sur des fichiers parfaitement séparés et organisés !

Edit : Lorsque je parle de données externe, ce ne sont donc pas des données comme le xml etc.. En fait ce sont des Fake-EditorWindown (façon de dire). Les classes contiennent dans une "method" du contenu comme "GUILayout, GUI, EditorGUILayout". Je tenais juste à préciser au cas où pour éviter toute confusion ^^

Edit 2 : Je viens de penser à une chose. Bien que là pas sûr de comment faire. Est-il possible de, en premier on prépare un OnGUI dans notre class EditorWindow assez simple et on override depuis l'extérieur ? Mais du coup, les classes qui override vers notre EditorWindow devrait être subnommé comment ? (Désolé je ne me souviens plus de comment ça s'appelle ce qu'on écrit à droite du nom de notre classe. (ex: class notre : cetruclà {} )

--

Une autre petite question pour la route, est-il possible de récupérer depuis une Class les informations de l'instance d'un EditorWindow (si il est chargé bien entendu) sans devoir passer par CreateInstance ou New (bien que New se fait rappeler à l'ordre par la console et demande ScriptableObject.createInstance() vu qu'il point un EditorWindow) ?

Le souci c'est que hormis créer une instance pour récupérer la valeurs qu'il détient je ne vois pas comment faire. Car créer une instance pose le souci que il va "doubler" (de manière invisible) la fenêtre EditorWindow et lorsqu'on voudra fermer cette dernière dans Unity, une Instance existera toujours et donc il faudra recharger le Layout d'Unity pour voir un message d'erreur dans la console comme quoi une erreur de Destruction de Fenêtre est survenue ! (Failed to destroy editor windows: #1)

En espérant que l'idée est assez claire (dans l'ensemble au moins).

Merci

Haseo
Messages : 2
Inscription : 12 Mars 2015 12:40

Re: EditorWindow : Extern Data et Instance

Message par Haseo » 12 Mars 2015 16:42

Bon, Désolé du double post mais le premier va être infini si j'édite pour ajouter du code encore. J'explique en dessous des deux codes (je les ai réduits au plus simple possible pour éviter les lectures sans fin) :

Le Hub :

Code : Tout sélectionner

using UnityEditor;
using UnityEngine;

class Hub : EditorWindow
{
    [MenuItem("Test/MyNewWindow")]
    public static void Init()
    {
        Debug.Log("Une instance à été lancé !");
        EditorWindow.GetWindow<Hub>();
    }

    private ExtendClassData ext;
    public bool show, closed;

    private void OnGUI()
    {
        if (GUILayout.Button("Afficher données Externes"))      { show = true; }
        if (GUILayout.Button("Clôturer les données Externes"))  { show = false; ext = null; }

        if (show) { LoadExtendData(); }
    }

    private void LoadExtendData()
    {
        if (ext == null) { ext = new ExtendClassData(); }
        ext.ExtendOnGUI();
    }

}
L'ExtendData :

Code : Tout sélectionner

using UnityEditor;
using UnityEngine;

class ExtendClassData
{
    private Hub H; 

    private void Update()
    {
        Debug.Log("Update");
    }

    public void ExtendOnGUI()
    {
        //Debug.Log(H.testExt);
        GUILayout.Space(20f);
        GUILayout.Button("njkdjknlkjnldsklj,nklkldslk,kl");
    }
}     
Bon dans l'état, la moitié de ce que je cherche à faire fonctionne. De cette manière si je clique sur le Bouton pour Afficher les données, elles s'affichent correctement en supplément de celle du Hub dans son OnGUI. (Donc c'est le bouton dans ExtendData qui s'ajoute à mon OnGUI du Hub)

Si je clique sur Clôturer, les données disparaissent et j'ai ajouté "ext = null" pour vider l'instance créer vers ExtendData. Est-ce bien comme cela qu'il faut faire pour décharger l'instance de ext dans l'Editeur Unity ?

Maintenant viens le problème des données dans l'autre sens. Par exemple, si dans mon Hub je créer une variable "string canard = "coincoin" et que je veux la récupérer dans ExtendData quoique j'imagine j'ai des erreurs d'instances "Object reference not set to an instance of an object".

J'ai essayé un peu de tout (bien sûr pas plusieurs en même temps hein ! Un seul à la fois :
H = new Hub();
if (H == null) { H = (Hub)(ScriptableObject.CreateInstance("Hub")); }
H = Hub.CreateInstance("Hub") as Hub;
Et ce que j'aimerais faire, c'est donc pouvoir récupérer les données accessible (donc les public) créer dans Hub depuis ExtendData sans que cela recréer une instance de Hub (comme j'expliquais sur le premier message). Sinon Unity se retrouve avec une fenêtre visible et une invisible qui persiste même après fermeture de la vrai fenêtre.

Donc au lieu de "recréer" une instance de Hub, ne peut-on pas ré-utiliser son instance déjà créer pour y piocher et afficher ses données ? Ou tout autre idée est la bienvenue !

J'espère y arriver seul (comme jusqu'à maintenant) mais là je commence à sécher.

Merci d'avance.

Edit : Juste une ligne promis. Autre soucis, ExtendData ne peut pas utiliser Update/Start... sans type de classe ?

Répondre

Revenir vers « (C#) CSharp »