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é ".

Valamorde
la source

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.

Eric P.
la source
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; 
        }
    }
}
jgallant
la source
Ç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