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.
– Lev-LukomskyiAs of 4.6 this stopped working for me, maybe something is missing for the script?
– Ash-BlueWhy setting
– QuantumHiveGUI.enabled = true;after setting it to false?because otherwise all controls following this one would be disabled
– It3rationDid anyone manage to get this to work in Unity 4.6 and 5?
– Ben-BearFish