public override void OnInspectorGUI()
    {
        serializedObject.Update();

        var lastElement = m_events.serializedProperty.GetArrayElementAtIndex(serializedObject.FindProperty("EventEntries").arraySize - 1);

        if (lastElement != null)
        {
            TimedEventEntry entry      = GetParent(lastElement.FindPropertyRelative("Observer")) as TimedEventEntry;
            float           timeOffset = entry != null ? entry.TimeOffset : 120;
            GUILayout.Label("Starting Time Offset: (" + serializedObject.FindProperty("StartingTimeOffset").floatValue.ToString() + "/" + timeOffset.ToString() + ")", GUILayout.Width(260));
            serializedObject.FindProperty("StartingTimeOffset").floatValue = GUILayout.HorizontalSlider(serializedObject.FindProperty("StartingTimeOffset").floatValue, 0f, timeOffset);
            GUILayout.Space(10);
        }
        GUILayout.Label("Timed Events:", GUILayout.Width(90));
        m_events.DoLayoutList();
        serializedObject.ApplyModifiedProperties();
    }
    private void OnEnable()
    {
        m_events = new ReorderableList(serializedObject,
                                       serializedObject.FindProperty("EventEntries"),
                                       true, true, true, true);

        m_events.drawElementBackgroundCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
        {
            /// Set background color based on name of observer object (todo: refactor this so it's not so ugly, and perhaps configurable from editor)
            var             element = m_events.serializedProperty.GetArrayElementAtIndex(index);
            TimedEventEntry bgEntry = GetParent(element.FindPropertyRelative("Observer")) as TimedEventEntry;
            if (bgEntry != null && bgEntry.Observer != null)
            {
                if (isActive)
                {
                    EditorGUI.DrawRect(rect, Color.blue);
                }
                else if (bgEntry.Observer.ObserverName.Contains("Eagan"))
                {
                    EditorGUI.DrawRect(rect, Color.white);
                }
                else if (bgEntry.Observer.ObserverName.Contains("Kate"))
                {
                    EditorGUI.DrawRect(rect, Color.gray);
                }
                else
                {
                    EditorGUI.DrawRect(rect, Color.clear);
                }
            }
        };

        m_events.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
        {
            int spacing = 2;
            var element = m_events.serializedProperty.GetArrayElementAtIndex(index);
            rect.y += 2;

            float standardWidth = rect.width / 6f;

            float widthSoFar = rect.x;

            EditorGUI.PropertyField(
                new Rect(rect.x, rect.y, standardWidth / 2f, EditorGUIUtility.singleLineHeight),
                element.FindPropertyRelative("TimeOffset"), GUIContent.none);

            widthSoFar += (standardWidth / 2f) + spacing;

            EditorGUI.PropertyField(
                new Rect(widthSoFar, rect.y, standardWidth * .75f, EditorGUIUtility.singleLineHeight),
                element.FindPropertyRelative("Observer"), GUIContent.none);

            widthSoFar += (standardWidth * .75f) + spacing;

            TimedEventEntry entry = GetParent(element.FindPropertyRelative("Observer")) as TimedEventEntry;

            if (entry != null && entry.Observer != null)
            {
                EditorGUI.LabelField(new Rect(widthSoFar, rect.y, standardWidth, EditorGUIUtility.singleLineHeight), entry.Observer.ObserverName);
                widthSoFar += (standardWidth) + spacing;
            }

            EditorGUI.PropertyField(
                new Rect(widthSoFar, rect.y, standardWidth * 1.5f, EditorGUIUtility.singleLineHeight),
                element.FindPropertyRelative("TypeOfEvent"), GUIContent.none);
            widthSoFar += (standardWidth * 1.5f) + spacing;

            if (entry != null && entry.TypeOfEvent == TimedEventType.LookAtObject)
            {
                EditorGUI.PropertyField(
                    new Rect(widthSoFar, rect.y, standardWidth * .75f, EditorGUIUtility.singleLineHeight),
                    element.FindPropertyRelative("TargetObject"), GUIContent.none);

                widthSoFar += (standardWidth * .75f) + spacing;

                if (entry != null && entry.TargetObject != null)
                {
                    EditorGUI.LabelField(new Rect(widthSoFar, rect.y, standardWidth, EditorGUIUtility.singleLineHeight), entry.TargetObject.TargetName);
                    widthSoFar += (standardWidth) + spacing;
                }
            }
        };
    }