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;

该字段永远不会禁用,当我交换 RangeLock 属性时,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]

=> 对于这些情况,您需要自己编写一个新的组合属性和抽屉!