How to make a readonly property in inspector?

This is the end-all answer - it will allow you to mark -any- field as readonly with a single property attribute / property drawer. It’s partially based on scottmontgomerie’s answer. This version also dispatches the property height based on how “expanded” the property is.

public class ReadOnlyAttribute : PropertyAttribute
{

}

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

public class Test
{
    [ReadOnly] public string a;
    [ReadOnly] public int b;
    [ReadOnly] public Material c;
    [ReadOnly] public List<int> d = new List<int>();
}

Works like a charm.

Just tried this code - works great: [33206-showonlypropertydrawer.png|33206] And you dont need to override GetPropertyHeight - just remove it and code will be simpler.

As of 4.6 this stopped working for me, maybe something is missing for the script?

Why setting GUI.enabled = true; after setting it to false?

because otherwise all controls following this one would be disabled

Did anyone manage to get this to work in Unity 4.6 and 5?