2

所以,这里是代码:

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

这是一个简单的自定义属性和属性抽屉,它允许我们禁用所有标记(通过 [ReadOnly])在 GUI 中禁用的字段。所以列表的元素被禁用,但是列表的大小仍然在 GUI 中启用。我该如何解决?

谢谢你。

更新:请看看它在检查器中的外观

4

2 回答 2

0

问题是您的属性抽屉用于呈现列表中的每个元素(属性),而不是整个列表本身。

像这样。每个属性都变成只读的,但列表对象本身仍然呈现相同的状态,Unity 呈现它的方式是显示“Size”属性。

于 2017-06-03T19:15:33.260 回答
-1

尝试这个:

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;
}
于 2017-06-01T11:27:24.943 回答