Version 3.3.0.1

OdinAttributeDrawer<TAttribute, TValue> class

Namespace: Sirenix.OdinInspector.Editor
Assembly: Sirenix.OdinInspector.Editor
public abstract class OdinAttributeDrawer<TAttribute, TValue> : OdinAttributeDrawer<TAttribute> where TAttribute : Attribute

Base class for all type specific attribute drawers. For non-type specific attribute drawers see OdinAttributeDrawer<TAttribute, TValue>.

Odin supports the use of GUILayout and takes care of undo for you. It also takes care of multi-selection in many simple cases. Checkout the manual for more information on handling multi-selection.

Also note that Odin does not require that your custom attribute inherits from Unity's PropertyAttribute.

Inheritance
Remarks

Checkout the manual for more information.

Example

Example using the OdinAttributeDrawer<TAttribute, TValue>.

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class CustomRangeAttribute : System.Attribute
{
    public float Min;
    public float Max;

    public CustomRangeAttribute(float min, float max)
    {
        this.Min = min;
        this.Max = max;
    }
}

// Remember to wrap your custom attribute drawer within a #if UNITY_EDITOR condition, or locate the file inside an Editor folder.

public sealed class CustomRangeAttributeDrawer : OdinAttributeDrawer<CustomRangeAttribute, float>
{
    protected override void DrawPropertyLayout(GUIContent label)
    {
        this.ValueEntry.SmartValue = EditorGUILayout.Slider(label, this.ValueEntry.SmartValue, this.Attribute.Min, this.Attribute.Max);
    }
}

// Usage:
public class MyComponent : MonoBehaviour
{
    [CustomRangeAttribute(0, 1)]
    public float MyFloat;
}
Example

Example using the OdinAttributeDrawer<TAttribute>.

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class GUITintColorAttribute : System.Attribute
{
    public Color Color;

    public GUITintColorAttribute(float r, float g, float b, float a = 1)
    {
        this.Color = new Color(r, g, b, a);
    }
}

// Remember to wrap your custom attribute drawer within a #if UNITY_EDITOR condition, or locate the file inside an Editor folder.

public sealed class GUITintColorAttributeDrawer : OdinAttributeDrawer<GUITintColorAttribute>
{
    protected override void DrawPropertyLayout(GUIContent label)
    {
       Color prevColor = GUI.color;
       GUI.color *= this.Attribute.Color;
       this.CallNextDrawer(label);
       GUI.color = prevColor;
    }
}

// Usage:
public class MyComponent : MonoBehaviour
{
    [GUITintColor(0, 1, 0)]
    public float MyFloat;
}
Example

Odin uses multiple drawers to draw any given property, and the order in which these drawers are called is defined using the DrawerPriorityAttribute. Your custom drawer injects itself into this chain of drawers based on its DrawerPriorityAttribute. If no DrawerPriorityAttribute is defined, a priority is generated automatically based on the type of the drawer. Each drawer can ether choose to draw the property or not, or pass on the responsibility to the next drawer by calling CallNextDrawer(), as the GUITintColor attribute does in the example above.

This means that there is no guarantee that your drawer will be called, since other drawers could have a higher priority than yours and choose not to call CallNextDrawer().

Note that Odin's DefaultDrawerChainResolver has full support for generic class constraints, and if that is not enough, you can also add additional type constraints by overriding CanDrawTypeFilter

Also note that all custom property drawers needs to handle cases where the label provided by the DrawPropertyLayout is null, otherwise exceptions will be thrown when in cases where the label is hidden. For instance when [HideLabel] is used, or the property is drawn within a list where labels are also not shown.

[DrawerPriority(DrawerPriorityLevel.AttributePriority)]
public class MyCustomAttributeDrawer<T> : OdinAttributeDrawer<MyCustomAttribute, T> where T : class
{
    public override bool CanDrawTypeFilter(Type type)
    {
        return type != typeof(string);
    }

    protected override void DrawPropertyLayout(GUIContent label)
    {
        // Draw property here.
    }
}

Type Parameters

TAttribute

The attribute that this drawer should be applied to.

TValue

The type of the value the drawer should be drawing. Note that Odin's DefaultDrawerChainResolver has full support for generic constraints.

Constructors

OdinAttributeDrawer()
protected OdinAttributeDrawer()

Properties

ValueEntry
Gets the strongly typed ValueEntry of the OdinAttributeDrawer's property.
public IPropertyValueEntry<TValue> ValueEntry { get; }

Methods

CanDrawAttributeProperty(InspectorProperty)
Tests if the drawer can draw for the specified property.
protected override sealed bool CanDrawAttributeProperty(InspectorProperty property)
Parameters
InspectorProperty property

The property to test.

Returns
System.Boolean

true if the drawer can drawn the property. Otherwise false.

CanDrawAttributeValueProperty(InspectorProperty)
Tests if the attribute drawer can draw for the specified property.
protected virtual bool CanDrawAttributeValueProperty(InspectorProperty property)
Parameters
InspectorProperty property

The property to test.

Returns
System.Boolean

true if the drawer can drawn the property. Otherwise false.

DrawPropertyLayout(GUIContent)
Draws the property with the given label. Override this to implement your custom OdinAttributeDrawer.
protected override void DrawPropertyLayout(GUIContent label)
Parameters
UnityEngine.GUIContent label

Optional label for the property.

Extension Methods
Derived Classes