Variables conditionnelles dans les objets scriptables


10

Pendant l'utilisation ScriptableObjects, comment puis-je rendre certaines variables conditionnelles?

Exemple de code:

[System.Serializable]
public class Test : ScriptableObject
{
      public bool testbool;
      public string teststring;
      public int testint;
}

Objectif: quand est testbool == truealors teststringdisponible pour éditer, quand testbool == falsealors testintest disponible pour éditer tandis que l'autre est " grisé ".

Réponses:


7

Le chemin convivial de l'éditeur est un "inspecteur personnalisé". En termes d'API Unity, cela signifie étendre la classe Editor .

Voici un exemple de travail, mais le lien doc ci-dessus vous guidera à travers de nombreux détails et options supplémentaires:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
    private Test targetObject;

    void OnEnable()
    {
        targetObject = (Test) this.target;
    }

    // Implement this function to make a custom inspector.
    public override void OnInspectorGUI()
    {
        // Using Begin/End ChangeCheck is a good practice to avoid changing assets on disk that weren't edited.
        EditorGUI.BeginChangeCheck();

        // Use the editor auto-layout system to make your life easy
        EditorGUILayout.BeginVertical();
        targetObject.testBool = EditorGUILayout.Toggle("Bool", targetObject.testBool);

        // GUI.enabled enables or disables all controls until it is called again
        GUI.enabled = targetObject.testBool;
        targetObject.testString = EditorGUILayout.TextField("String", targetObject.testString);

        // Re-enable further controls
        GUI.enabled = true;

        targetObject.testInt = EditorGUILayout.IntField("Int", targetObject.testInt);

        EditorGUILayout.EndVertical();

        // If anything has changed, mark the object dirty so it's saved to disk
        if(EditorGUI.EndChangeCheck())
            EditorUtility.SetDirty(target);
    }
}

N'oubliez pas que ce script utilise des API uniquement pour l'éditeur, il doit donc être placé dans un dossier nommé Editor. Le code ci-dessus transformera votre inspecteur en ce qui suit:

entrez la description de l'image ici

Cela devrait vous permettre de rouler jusqu'à ce que vous soyez plus à l'aise avec les scripts de l'éditeur.


4
[System.Serializable]
public class Test : ScriptableObject
{
    private bool testbool;
    public string teststring;
    public int testint;

    public string TestString 
    {
        get 
        {    
            return teststring; 
        }
        set 
        {
            if (testbool)
                teststring = value; 
        }
    }
}

Ça a l'air précis! Je vais tester et faire rapport!
Valamorde

Il semble que cela n'empêchera qu'une valeur erronée et ne la rendra pas indisponible à modifier pendant qu'une condition est true.
Valamorde
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.