I have the following immutable struct.
[Serializable]
public readonly struct Wind
{
/// <param name="windSpeed">The speed of the wind</param>
/// <param name="rho">The density of the air, if not provided 15 degrees assumed aka 1.225f</param>
public Wind(Vector3 windSpeed, float rho = 1.225f)
{
Speed = windSpeed;
Rho = rho;
}
/// <summary>
/// The speed of the wind [m/s]
/// </summary>
[DisplayReadOnly]
public readonly Vector3 Speed;
/// <summary>
/// Density of the air [kg/m^3]
/// </summary>
[DisplayReadOnly]
public readonly float Rho;
}
The problem with this is that, Unity can not serialize readonly fields so i followed Anton Semchenko's guide on how to make an attribute to only display these fields in the inspector for the ease of debugging.
These are the scripts i made:
The Custom property drawer
[CustomPropertyDrawer(typeof(DisplayReadOnlyAttribute))]
public class DisplayReadOnlyAttributeDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
DisplayReadOnlyAttribute att = (DisplayReadOnlyAttribute)attribute;
object obj = property.serializedObject.targetObject;
Type type = obj.GetType();
FieldInfo field = type.GetField(property.propertyPath, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
object val = field?.GetValue(obj);
if (att.warningIfNull && (val == null || val.ToString().Equals("null")))
val += " <-This value should NOT be NULL!";
EditorGUI.LabelField(position, string.Format("{0}: {1}", label.text, val));
}
}
The attribute that signals if a readonly property should be displayed in the inspector
public class DisplayReadOnlyAttribute : PropertyAttribute
{
/// <summary>
/// Writes a warning if the value of this field is null
/// </summary>
public readonly bool warningIfNull = false;
public DisplayReadOnlyAttribute(bool _warningIfNull = false)
{
warningIfNull = _warningIfNull;
}
}
The problem is that this attribute does not work if it is used on a readonly field it only get's called when used on a non readonly field public float Rho;
I'm not just only interested in the above solution if you do know how to display readonly fields in another way please don't keep it for yourself
