Page 1 sur 1

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

Publié : 16 Août 2019 17:47
par Maki-Sama
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é 2509 fois
.
2.png
2.png (12.74 Kio) Consulté 2509 fois
.
3.png
3.png (11.76 Kio) Consulté 2509 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.

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

Publié : 17 Août 2019 09:30
par Alesk
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:

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

Publié : 17 Août 2019 10:39
par Maki-Sama
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 ? )

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

Publié : 17 Août 2019 10:55
par Alesk
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.

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

Publié : 17 Août 2019 15:00
par Maki-Sama
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: