Benutzerdefinierter Unity C # -Skripteditor mit dynamischem Aufzählungsfeld

Innat3

Nehmen wir an, wir haben die folgenden Aufzählungen

public enum Section
{
    A,
    B
}

public enum SectionA
{
    A1,
    A2,
    A3
}

public enum SectionB
{
    B1,
    B2,
    B3
}

Ich möchte ein Skript mit zwei öffentlichen Enum-Feldern mit auswählbaren Werten als Dropdown-Liste aus dem Unity-Editor erstellen. Der erste dient zur Auswahl des Abschnitts (A oder B), während der zweite eine Aufzählung vom Typ Abschnitt A oder Abschnitt B sein sollte, je nachdem, welcher Wert im ersten Feld ausgewählt wurde.

Ich habe dafür folgende Skripte erstellt:

public class Item : MonoBehaviour
{
    [HideInInspector]
    public Section Section;

    [HideInInspector]
    public System.Enum Value;
}


[CustomEditor(typeof(Item))]
public class ItemEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        Item item = target as Item;

        item.Section = (Section)EditorGUILayout.EnumPopup(item.Section);

        switch (item.Section)
        {
            case Section.A:
                item.Value = (SectionA)EditorGUILayout.EnumPopup(item.Value);
                break;
            case Section.B:
                item.Value = (SectionB)EditorGUILayout.EnumPopup(item.Value);
                break;
        }
    }
}

Es wird jedoch eine Ausnahme ausgelöst, die besagt, dass sie item.Valuenull ist.

Ich habe auch versucht zu ersetzen

item.Value = (SectionA)EditorGUILayout.EnumPopup(item.Value);

mit

item.Value = (SectionA)EditorGUILayout.EnumPopup(item.Value ?? SectionA.A1);

um zu versuchen, ihm einen "Anfangswert" zu geben, aber dann A1überschreibt der Wert den ausgewählten, wenn ich die Wiedergabetaste drücke. Irgendwelche Ideen?

Innat3

Ich habe es behoben, indem ich ein Platzhalterfeld hinzugefügt habe, um den Aufzählungswert zu speichern.

public class Item : MonoBehaviour
{
    [HideInInspector]
    public Section Section;

    [HideInInspector]
    public System.Enum Value;

    [HideInInspector]
    public SectionA a;

    [HideInInspector]
    public SectionB b;
}

switch (item.Section)
{
    case Section.A:
        item.Value = EditorGUILayout.EnumPopup(item.a = (SectionA)(item.Value ?? item.a));
        break;
    case Section.B:
        item.Value = EditorGUILayout.EnumPopup(item.b = (SectionB)(item.Value ?? item.b));
        break;
}

Die vorherige Lösung kann beim Wechseln von Szenen häufig keine Werte speichern. Das funktioniert richtig.

public class Item : MonoBehaviour
{ 
    public Section section;
    public SectionA sectionA;
    public SectionB sectionB;

    public System.Enum Value
    {
        get
        {
            switch(section)
            {
                case Section.A:
                    return sectionA;
                case Section.B:
                    return sectionB;
                default:
                    return null;
            }
        }
    }
}

[CustomEditor(typeof(Item))]
public class ItemEditor : Editor
{
    SerializedProperty section;
    SerializedProperty sectionA;
    SerializedProperty sectionB;

    void OnEnable()
    {
        section = serializedObject.FindProperty("section");
        sectionA = serializedObject.FindProperty("sectionA");
        sectionB = serializedObject.FindProperty("sectionB");
    }

    public override void OnInspectorGUI()
    {        
        serializedObject.Update();
        EditorGUILayout.PropertyField(section);
        switch ((Section)section.enumValueIndex)
        {
            case Section.A:
                EditorGUILayout.PropertyField(sectionA);
                break;
            case Section.B:
                EditorGUILayout.PropertyField(sectionB);
                break;
        }   
        serializedObject.ApplyModifiedProperties();
    }
}

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Bedingte Logik mit Aufzählungsfeld

Nach Aufzählungsfeld mit Ruhezustandssuche sortieren

Benutzerdefinierter WooCommerce-Endpunkt mit dynamischem Wert funktioniert nicht

Benutzerdefinierter Dialog mit dynamischem Layout wird nicht richtig angezeigt

Aufzählungsfarben mit dynamischem Alpha-Wert

Segmentierungsfehler in C mit dynamischem Array

Jackson kann unveränderliches Objekt nicht mit Aufzählungsfeld deserialisieren

So behalten Sie ein Objekt mit einem Aufzählungsfeld bei

Problem mit benutzerdefiniertem Vektor / dynamischem Array C ++

C # Boolesche Logik mit dynamischem LINQ?

c # Kind mit dynamischem Zugriff als IEnumerable

c ++ Vektorkonstruktor mit benutzerdefinierter Funktion

C # - Automapper mit benutzerdefinierter Typkonvertierung

c ++ Sortierung mit benutzerdefinierter Vergleichsfunktion

Hibernate Search / Lucene-Bereichsabfrage mit Aufzählungsfeld gibt keine Ergebnisse zurück

Ist es möglich, dass ein Aufzählungsfeld in einer Klasse mit OrmLite beibehalten wird?

Scala, Play-Framework, Slick: DB-Join-Abfrage mit Filter auf Aufzählungsfeld

Ich muss Namen in alphabetischer Reihenfolge mit dynamischem Speicher in c anordnen

OrdinalIgnoreCase funktioniert nicht mit dynamischem Array in c#

Operator-Schlüsselwort mit dynamischem Typ in c#

C # Zeile mit dynamischem Textfeld / Schaltfläche / Raster löschen

C++ erstellt eine Warteschlange mit dynamischem Speicher

Generisches Primitiv kann nicht mit dynamischem C # umgewandelt werden

Zugriffsverletzung mit dynamischem 2-dimensionalem Array in C ++

Deserialisieren von Json mit dynamischem Schlüssel C#

Benutzerdefinierter C ++ - Komparator funktioniert nicht mit MWE

C ++ std :: sort mit benutzerdefinierter Funktion

C # Task-Umschreibfunktion mit benutzerdefinierter Task

C ++ libhiredis mit libev und benutzerdefinierter Ereignisschleife

TOP Liste

  1. 1

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  2. 2

    Eclipse Oxygen - Projekte verschwinden

  3. 3

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  4. 4

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  5. 5

    Wie kann ich den Kaskadenmodus global einstellen?

  6. 6

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  7. 7

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  8. 8

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  9. 9

    Modbus Python Schneider PM5300

  10. 10

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  11. 11

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  12. 12

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  13. 13

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  14. 14

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  15. 15

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  16. 16

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

  17. 17

    ElasticSeach Auto Complete mit dem Vervollständigungsvorschlag, um das vollständige Dokument zurückzugeben

  18. 18

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  19. 19

    Wie wählt man Unterschiede mit drei Tabellen aus?

  20. 20

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  21. 21

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

heißlabel

Archiv