[DB-AL] Sérialisation d'un CustomEditor

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
Avatar de l’utilisateur
Maki-Sama
Messages : 36
Inscription : 12 Mars 2018 21:00

[DB-AL] Sérialisation d'un CustomEditor

Message par Maki-Sama » 16 Août 2019 17:47

Salut la compagnie :hello:

dernièrement je me suis attaqué à un script afin qu'il propose des conditions multiple.

En clair, j'ai créé une sorte de déroulant appelé "Condition Type" et lorsque je clique sur le type de condition que je veux. Cela rajoute des variables (comme dans les image ci-dessous) grâce à la méthode CustomEditor. :super:
.
1.png
1.png (8.5 Kio) Consulté 2474 fois
.
2.png
2.png (12.74 Kio) Consulté 2474 fois
.
3.png
3.png (11.76 Kio) Consulté 2474 fois
.
Maintenant ma question c'est comment faire pour que je puisse sérialiser tout ça ?

Car actuellement c'est UNE seule condition, mais si jamais je voulais en mettre plusieurs. Comment procéder ? :0

Je vous laisse également les scripts afin que vous puissiez avoir tout les éléments.
.
Le script du jeu :

Code : Tout sélectionner

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

public class Conditions : MonoBehaviour
{
    public enum ConditionsType
    {
        None, KillerCounter, Destination, MoneyCounter, InventoryObjects, Dialog
    }

    public string Description;
    public ConditionsType ConditionsT = ConditionsType.None;

    //KillerCounter
    [Header("Killer Counter")]
    public string EnnemiName;
    public int EnnemiKills;

    //Destination
    [Header("Destination")]
    public string Destination;

    //MoneyCounter
    [Header("Money Counter")]
    public int CheckedMoney;

    //InventoryObjects
    [Header("Inventory Objects")]
    public string ObjectName;
    public int ObjectCount;

    //Dialog
    [Header("Dialog")]
    public Text DialogWindows;
    public string DialogCondition;
    
}



.
Et l'Editor :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using UnityEditor;
using UnityEngine.UI;

[CustomEditor(typeof(Conditions))]
public class ConditionsEditor : Editor
{
    public override void OnInspectorGUI()
    {
        Conditions ConditionsScript = (Conditions)target;

        ConditionsScript.Description = EditorGUILayout.TextField("Description", ConditionsScript.Description);

        ConditionsScript.ConditionsT = (Conditions.ConditionsType)EditorGUILayout.EnumPopup("Condition Type", ConditionsScript.ConditionsT);

        //Si le type est KillerCounter
        if (ConditionsScript.ConditionsT == Conditions.ConditionsType.KillerCounter)
        {
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("KILLER COUNTER", EditorStyles.boldLabel);

            //Affichage des variables
            ConditionsScript.EnnemiName = EditorGUILayout.TextField("Ennemi Name", ConditionsScript.EnnemiName);
            ConditionsScript.EnnemiKills = EditorGUILayout.IntField("Ennemi Kills", ConditionsScript.EnnemiKills);
        }

        //Si le type est Destination
        if (ConditionsScript.ConditionsT == Conditions.ConditionsType.Destination)
        {
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("DESTINATION", EditorStyles.boldLabel);

            //Affichage de la variable
            ConditionsScript.Destination = EditorGUILayout.TextField("Destination", ConditionsScript.Destination);
        }

        //Si le type est MoneyCounter
        if (ConditionsScript.ConditionsT == Conditions.ConditionsType.MoneyCounter)
        {
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("MONEY COUNTER", EditorStyles.boldLabel);

            //Affichage de la variable
            ConditionsScript.CheckedMoney = EditorGUILayout.IntField("Checked Money", ConditionsScript.CheckedMoney);
        }

        //Si le type est InventoryObjects
        if (ConditionsScript.ConditionsT == Conditions.ConditionsType.InventoryObjects)
        {
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("INVENTORY OBJECTS", EditorStyles.boldLabel);

            //Affichage des variables
            ConditionsScript.ObjectName = EditorGUILayout.TextField("Object Name", ConditionsScript.ObjectName);
            ConditionsScript.ObjectCount = EditorGUILayout.IntField("Object Count", ConditionsScript.ObjectCount);
        }

        //Si le type est Dialog
        if (ConditionsScript.ConditionsT == Conditions.ConditionsType.Dialog)
        {
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("DIALOG", EditorStyles.boldLabel);

            //Affichage de la variable
            ConditionsScript.DialogCondition = EditorGUILayout.TextField("Dialog Condition", ConditionsScript.DialogCondition);
        }
    }
}
Après, je pense que l'on peut passer par la POO, mais j'ai un peu de mal avec ça (d'où ma présence ::d )
Je repose donc sur vous.

Merci d'avance pour vos réponses.

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [DB-AL] Sérialisation d'un CustomEditor

Message par Alesk » 17 Août 2019 09:30

Tu entends quoi par "sérialisation" ? Parce que ça a une signification particulière ici, donc avant de te répondre je voudrais être sûr qu'on parle de la même chose :mrgreen:

Avatar de l’utilisateur
Maki-Sama
Messages : 36
Inscription : 12 Mars 2018 21:00

Re: [DB-AL] Sérialisation d'un CustomEditor

Message par Maki-Sama » 17 Août 2019 10:39

Salut,

alors quand je parle de sérialisation, je parle de répétition.

Comme [System.Serializable] que l'on utilise sur les classes.
Le problème c'est que le 'CustomEditor' ne fonctionne que sur les 'MonoBehaviour'. :triste1:
Et je ne sais pas si c'est possible de fusionner les deux (Ou du moins j'ai essayé mais échec :0 )

Voilà tout :cote:

(Après sinon, qu'est-ce que tu veux dire par signification particulière ? )

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [DB-AL] Sérialisation d'un CustomEditor

Message par Alesk » 17 Août 2019 10:55

Je disais ça parce que justement la "sérialisation" n'a rien à voir avec des répétitions ;)

Je te laisse lire la doc à ce sujet : https://docs.unity3d.com/Manual/script- ... ation.html

Ensuite, pour ce que tu veux faire, tu peux passer par des variables de type Array ou List.

Avatar de l’utilisateur
Maki-Sama
Messages : 36
Inscription : 12 Mars 2018 21:00

Re: [DB-AL] Sérialisation d'un CustomEditor

Message par Maki-Sama » 17 Août 2019 15:00

Je vois.

Après avoir encore fait plusieurs recherche, je suis tombé sur certains sujets parlant de 'PropertyDrawer'.

Je pense que c'est ça qui pourrait m'aider, mais je n'y comprends pas grand chose. 8/

En plus, d'après ce que j'ai compris du site : https://docs.unity3d.com/Manual/editor- ... awers.html

Il remplace le script CustomEditor, et cela me pose problème car c'est grâce à lui que je peux cacher les variables ou non lorsque je choisi le type de condition. :triste1:

Répondre

Revenir vers « (C#) CSharp »