【发布时间】:2020-06-30 17:32:47
【问题描述】:
我有以下不可变结构。
[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;
}
问题在于,Unity 无法序列化只读字段,因此我按照 Anton Semchenko 的 guide 介绍了如何在检查器中仅显示这些字段以方便调试.
这些是我制作的脚本:
自定义属性抽屉
[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));
}
}
指示是否应在检查器中显示只读属性的属性
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;
}
}
问题是,如果在只读字段上使用此属性将不起作用,它仅在用于非只读字段时才被调用public float Rho;
如果您知道如何以另一种方式显示只读字段,我不仅对上述解决方案感兴趣,请不要自己保留
【问题讨论】: