How to show an array of custom objects in Inspector?

I can show one object, but not an array of them.

BasicLight in Inspector: (I want to show an array of these)
BasicLight

LightTube contains an array of BasicLights and looks like this: (This does not work, I want to show an array of four fields each)
LightTube

How do I get an array of BasicLights to show the fields of each element (that we see in the first image)?
I have also tried making a CustomPropertyDrawer (not shown here), but I haven’t been able to get it to work with the custom inspector. Any suggestions?

Code is below.

BasicLight
(a basic light, of which arrays will be made of in the inspector)

[Serializable]
public class BasicLight : MonoBehaviour
{
    public bool isLightOn = false;

    public string name;
    public GameObject light;
    public float range = 30.0f;
    public float intensity = 1.5f;
}

EditBasicLight
(creates the GUI controls in Inspector)

[CustomEditor(typeof(BasicLight))]
public class EditBasicLight : Editor
{
    public override void OnInspectorGUI ()
    {
        serializedObject.Update ();
        BasicLight basicLight = target as BasicLight;

        basicLight.isLightOn = EditorGUILayout.Toggle ("on", basicLight.isLightOn);

        EditorGUI.indentLevel++;
        basicLight.name = EditorGUILayout.TextField ("name", basicLight.name);
        basicLight.light = EditorGUILayout.ObjectField ("light", basicLight.light);
        basicLight.range = EditorGUILayout.FloatField ("range", basicLight.range);
        basicLight.intensity = EditorGUILayout.FloatField ("intnsity", basicLight.intensity);
        EditorGUI.indentLevel--;
    }
}

BaseLight (LightTube inherits from this)
(attached to the GameObject)
(Other classes will extend this, hence the name ‘Base’Light.)

public class BaseLight : MonoBehaviour
{
    public bool on = false;
    public BasicLight [] lights;
}

EditBaseLight
(BaseLight Editor. Creates the GUI controls in Inspector)
(But how do you get the array to show correctly)

[CustomEditor(typeof(BaseLight))]
public class EditBaseLight : Editor
{
    public override void OnInspectorGUI ()
    {
        serializedObject.Update ();
        BaseLight baseLight = target as BaseLight;

        EditorGUIUtility.LookLikeInspector ();

        SerializedObject serializedObj = new SerializedObject (target);
        SerializedProperty lights = serializedObject.FindProperty ("lights");

        serializedObj.Update ();
        EditorGUILayout.HelpBox ("Default Inspector", MessageType.None);
        DrawDefaultInspector();
        serializedObj.ApplyModifiedProperties ();
    }
}

LightTube

public class LightTube : BaseLight
{

}

EditLightTube

[CustomEditor(typeof(LightTube))]
public class EditLightTube : EditBaseLight
{
    public override void OnInspectorGUI()
    {
        LightTube lightTube = target as LightTube;

        base.OnInspectorGUI ();
    }
}

When I add “[System.Serializable]” in front of my class definition, it works.

I discovered that if I remove the extension from MonoBehaviour, it shows the fields for each array element in Inspector.

However, I want to do special checks for input (eg when they check a box, turn on a light). So when I create the CustomEditor class, it requires a MonoBehaviour object.

So I’m stuck choosing one or the other. Either I can have the array show it correctly, or I can have a custom editor.

Is there any way to have both?

I also tried putting [SerializeField] before every variable in the BasicLight but there was no change.