Unity EditorGUI.PropertyField 无法完全禁用数组或列表
Unity EditorGUI.PropertyField can't fully disable array or List
所以,这是代码:
// 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 中仍然启用。我该如何解决?
谢谢。
更新:
请看看它在检查器中的样子
试试这个:
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;
}
问题是您的 属性 抽屉用于呈现列表中的 每个元素 (属性),而不是列表本身作为整个.
正是如此。每个 属性 确实变为只读,但列表对象本身仍然呈现相同,Unity 呈现它的方式是显示 "Size" 属性.
所以,这是代码:
// 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 中仍然启用。我该如何解决?
谢谢。
更新: 请看看它在检查器中的样子
试试这个:
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;
}
问题是您的 属性 抽屉用于呈现列表中的 每个元素 (属性),而不是列表本身作为整个.
正是如此。每个 属性 确实变为只读,但列表对象本身仍然呈现相同,Unity 呈现它的方式是显示 "Size" 属性.