Вы можете, конечно, вызвать OnValidate
также без Reflection, сделав его
public void OnValidate() ...
, а затем в вызове редактора
theProperty.SetValue(5);
((IntMonoBehaviourMock)target).OnValidate();
, или что я иногда делаю, это сделать Редакторподкласс соответствующего типа, поэтому у вас есть доступ к методам private
и protected
. Обычно я записываю его в разные файлы, используя
public partial class IntMonoBehaviourMock
{
...
#if UnityEditor
private partial class IntMonoBehaviourMockEditor { }
#endif
}
, а затем в отдельный файл
#if UnityEditor
public partial class IntMonoBehaviourMock
{
[CustomEditor(typeof(IntMonoBehaviourMock)]
private partial class IntMonoBehaviourMockEditor : Editor
{
...
}
}
#endif
Возможные типы весьма ограничены
AnimationCurve, BoundsInt, bool, Bounds, Color, double, float, int, long,
Quaternion, RectInt, Rect, string, Vector2, Vector2Int, Vector3, Vector3Int, Vector4
и специальный
UnityEngine.Object
, который является родительским классом для (почти) всех классов Unity.
В качестве альтернативы я могу использовать что-то вроде
var type = typeof(TValue);
if(type == typeof(int))
{
serializedProperty.intValue = value;
}
else if(type == typeof(string)
{
serializedProperty.stringValue = value;
}
...
else if(type.IsAssignableFrom(typeof(UnityEngine.Object)))
{
serializedProperty.objectReferenceValue = value;
}
else
{
Debug.LogError("Unassignable type: " + type.FullName);
}
на самом деле вы бы даже не требовали универсального, но могли бы просто использовать
var type = value.GetType();