Bedingte Variablen in skriptfähigen Objekten

10

ScriptableObjectsWie kann ich während der Verwendung einige Variablen bedingen?

Beispielcode:

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

Ziel: Wann ist testbool == truedann teststringzum Bearbeiten verfügbar, wann ist testbool == falsedann testintzum Bearbeiten verfügbar, während der andere " ausgegraut " ist.

Valamorde
quelle

Antworten:

7

Der Editor-freundliche Pfad ist ein "benutzerdefinierter Inspektor". In den Begriffen der Unity-API bedeutet dies, dass die Editor- Klasse erweitert wird.

Hier ist ein funktionierendes Beispiel, aber der obige Link zum Dokument führt Sie durch viele Details und zusätzliche Optionen:

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);
    }
}

Beachten Sie, dass dieses Skript nur Editor-APIs verwendet und daher in einem Ordner mit dem Namen Editor abgelegt werden muss. Der obige Code verwandelt Ihren Inspektor in Folgendes:

Geben Sie hier die Bildbeschreibung ein

Das sollte Sie ins Rollen bringen, bis Sie mit Editor-Skripten vertraut sind.

Eric P.
quelle
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
quelle
Es sieht präzise aus! Ich werde testen und zurückmelden!
Valamorde
Es scheint, dass dies nur einen falschen Wert verhindert und es nicht unmöglich macht, ihn zu bearbeiten, während eine Bedingung vorliegt true.
Valamorde