I have a custom editor in Unity 2019.4 LTS which displays an array of a serializable class not based on Object.
When a new array element is added it doesn’t seem to call my class constructor. How can I do this for a SerializedProperty? My class also has a SetClassDefaults() method but I can’t seem to call that from a SerializedProperty either.
U2022.1+ has SerializedProperty.boxedValue but that doesn’t help with U2019.4.
/// <summary>
/// Draw an array in the inspector with Add/Remove buttons.
/// </summary>
/// <param name="serializedProperty"></param>
/// <param name="labelGUIContent"></param>
/// <param name="labelWidth"></param>
/// <param name="elementName"></param>
/// <param name="buttonCompact"></param>
public static void DrawArray(SerializedProperty serializedProperty, GUIContent labelGUIContent, float labelWidth, string elementName, GUIStyle buttonCompact)
{
GUILayout.BeginHorizontal();
EditorGUILayout.LabelField(labelGUIContent, GUILayout.Width(labelWidth - 1f));
EditorGUILayout.LabelField(serializedProperty.arraySize.ToString("00"), GUILayout.Width(20f));
if (GUILayout.Button("+", GUILayout.MaxWidth(20f)))
{
serializedProperty.arraySize++;
SerializedProperty element = serializedProperty.GetArrayElementAtIndex(serializedProperty.arraySize - 1);
// How to call default constructor of serializable class not based on Object???
Debug.Log("[DEBUG] Element Type " + element.type.ToString());
}
if (GUILayout.Button("-", GUILayout.MaxWidth(20f)))
{
if (serializedProperty.arraySize > 0) { serializedProperty.arraySize--; }
}
GUILayout.EndHorizontal();
EditorGUI.indentLevel++;
for (int arrayIdx = 0; arrayIdx < serializedProperty.arraySize; arrayIdx++)
{
GUILayout.BeginHorizontal();
EditorGUILayout.LabelField(elementName + " " + (arrayIdx + 1).ToString(), GUILayout.Width(labelWidth - 16f));
EditorGUILayout.PropertyField(serializedProperty.GetArrayElementAtIndex(arrayIdx), GUIContent.none);
GUILayout.EndHorizontal();
}
EditorGUI.indentLevel--;
}