2017-05-31 3 views
0

So, hier ist der Code:Unity EditorGUI.PropertyField kann nicht vollständig deaktivieren Array oder Liste

// ReadOnlyAttribyte,cs 
public class ReadOnlyAttribute : PropertyAttribute 
{ 

} 

// ReadOnlyDrawer.cs 
[CustomPropertyDrawer(typeof(ReadOnlyAttribute))] 
public class ReadOnlyDrawer : PropertyDrawer 
{ 
public override float GetPropertyHeight(SerializedProperty property, 
             GUIContent label) 
{ 
    return EditorGUI.GetPropertyHeight(property, label, true); 
} 

public override void OnGUI(Rect position, 
          SerializedProperty property, 
          GUIContent label) 
{ 
    GUI.enabled = false; 
    EditorGUI.PropertyField(position, property, label, true); 
    GUI.enabled = true; 
} 
} 

// test 
[System.Serializable] 
public class GridObjectData : ScriptableObject 
{ 
    [ReadOnly] 
    public int ID; 

[ReadOnly] 
public List<GridCell> Grid; 
} 

Hier ist ein einfaches benutzerdefiniertes Attribut und Attribut Schublade, die uns alle markierten (von [Readonly] deaktivieren können) Felder in der GUI deaktiviert werden. Daher sind die Elemente der Liste deaktiviert, die Größe der Liste ist jedoch weiterhin in der GUI aktiviert. Wie könnte ich das beheben?

Vielen Dank.

Update: Bitte nehmen Sie sich einen Blick, wie es looks im Inspektor

Antwort

0

Das Problem ist, dass Ihr Eigentum Schublade für das Rendering jedes Element verwendet wird (Eigentum) in die Liste und nicht die Liste selbst als Ganzes.

Als solche. Jede Eigenschaft wird schreibgeschützt, aber das Listenobjekt selbst wird immer noch gleich dargestellt, und die Art, wie Unity es darstellt, wird durch die Eigenschaft "Größe" angezeigt.

+0

Vielen Dank für Ihre Antwort! Was könnte jedoch getan werden? Kann ich verbieten, die ganze Liste irgendwie zu zeichnen? – PaveL

+0

Ich bin nicht vertraut mit jeder Art und Weise, wie Sie es tun können, außer nicht mit einer Liste oder Array, aber mit einem anderen benutzerdefinierten Typ, der es umschließt. –

+0

Danke! Ich nehme es als die richtige Antwort! – PaveL

0

Try this:

public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) 
{ 
    bool previousEnableState = GUI.enabled; 
    GUI.enabled = false; 
    EditorGUI.PropertyField(position, property, label, true); 
    GUI.enabled = previousEnableState; 
} 
+0

Es funktioniert nicht. Vielleicht haben Sie den Punkt der Frage verpasst? Ich habe oben ein beschreibendes Bild hinzugefügt. Bitte schau es dir an. – PaveL

Verwandte Themen