unity PropertyAttribute,干扰其他PropertyAttributes
Unity PropertyAttribute, interfering with other PropertyAttributes
我有一个属性
public class LockAttribute : PropertyAttribute { }
使用自定义抽屉脚本
[CustomPropertyDrawer(typeof(LockAttribute))]
public class LockAttributePropertyDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginDisabledGroup(Application.isPlaying);
_= EditorGUI.PropertyField(position, property, label);
EditorGUI.EndDisabledGroup();
}
}
它的目的是在应用程序播放时禁用检查器字段。
如果我按这个顺序使用它
[SerializeField,Range(0,100),Lock] private int m_Resolution;
该字段永远不会禁用,当我交换 Range
和 Lock
属性时,Range
属性无效。
有没有办法让两个属性都生效?
我尝试使用
Base.OnGUI(position, property, label);
而不是
EditorGUI.PropertyField(position, property, label);
但这样做会导致 No GUI Implmented
出现在我的字段上。
看起来像是 Unity 2020.3 中的“错误”。
如果我简单地颠倒顺序(Unity 2021.2.2f1),它对我有用:
[SerializeField]
[Lock]
[Range(0, 100)]
private int m_Resolution;
或者您也可以添加 order
参数,例如
[SerializeField]
[Range(0, 100, order = 1)]
[Lock(order = 0)]
private int m_Resolution;
虽然我宁愿直接让它们以正确的顺序排列 ^^
我的一般猜测:原因是在这种情况下,您首先添加禁用组,然后让 PropertyField
处理后来添加的任何其他内部可能不使用 PropertyField
的抽屉,而是直接值抽屉。
但是,如果您先有 Range
,它已经用直接值字段(滑块)完全覆盖抽屉,并且不会通过 PropertyField
进一步转发绘图调用,因此不会处理以后的属性抽屉再也没有了。
长话短说:不幸的是,多个属性总是很棘手,其中大部分无法组合,或者至少在这种情况下顺序很重要!
例如,即使乍一看 [Min]
属性不会改变 int
字段的外观,但您的 [Lock]
仍然需要先行,否则会被忽略.
还有例如无论顺序如何,根本无法组合 [Range]
和 [Min]
。
=> 对于这些情况,您需要自己编写一个新的组合属性和抽屉!
我有一个属性
public class LockAttribute : PropertyAttribute { }
使用自定义抽屉脚本
[CustomPropertyDrawer(typeof(LockAttribute))]
public class LockAttributePropertyDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginDisabledGroup(Application.isPlaying);
_= EditorGUI.PropertyField(position, property, label);
EditorGUI.EndDisabledGroup();
}
}
它的目的是在应用程序播放时禁用检查器字段。
如果我按这个顺序使用它
[SerializeField,Range(0,100),Lock] private int m_Resolution;
该字段永远不会禁用,当我交换 Range
和 Lock
属性时,Range
属性无效。
有没有办法让两个属性都生效?
我尝试使用
Base.OnGUI(position, property, label);
而不是
EditorGUI.PropertyField(position, property, label);
但这样做会导致 No GUI Implmented
出现在我的字段上。
看起来像是 Unity 2020.3 中的“错误”。
如果我简单地颠倒顺序(Unity 2021.2.2f1),它对我有用:
[SerializeField]
[Lock]
[Range(0, 100)]
private int m_Resolution;
或者您也可以添加 order
参数,例如
[SerializeField]
[Range(0, 100, order = 1)]
[Lock(order = 0)]
private int m_Resolution;
虽然我宁愿直接让它们以正确的顺序排列 ^^
我的一般猜测:原因是在这种情况下,您首先添加禁用组,然后让 PropertyField
处理后来添加的任何其他内部可能不使用 PropertyField
的抽屉,而是直接值抽屉。
但是,如果您先有 Range
,它已经用直接值字段(滑块)完全覆盖抽屉,并且不会通过 PropertyField
进一步转发绘图调用,因此不会处理以后的属性抽屉再也没有了。
长话短说:不幸的是,多个属性总是很棘手,其中大部分无法组合,或者至少在这种情况下顺序很重要!
例如,即使乍一看 [Min]
属性不会改变 int
字段的外观,但您的 [Lock]
仍然需要先行,否则会被忽略.
还有例如无论顺序如何,根本无法组合 [Range]
和 [Min]
。
=> 对于这些情况,您需要自己编写一个新的组合属性和抽屉!