/// <summary>
        /// On enable, grabs our serialized properties
        /// </summary>
        protected virtual void OnEnable()
        {
            FloatController myTarget = (FloatController)target;

            _TargetObject = serializedObject.FindProperty("TargetObject");

            _Curve    = serializedObject.FindProperty("Curve");
            _MinValue = serializedObject.FindProperty("MinValue");
            _MaxValue = serializedObject.FindProperty("MaxValue");
            _Duration = serializedObject.FindProperty("Duration");

            _Amplitude = serializedObject.FindProperty("Amplitude");
            _Frequency = serializedObject.FindProperty("Frequency");
            _Shift     = serializedObject.FindProperty("Shift");

            _OneTimeDuration  = serializedObject.FindProperty("OneTimeDuration");
            _OneTimeAmplitude = serializedObject.FindProperty("OneTimeAmplitude");
            _OneTimeCurve     = serializedObject.FindProperty("OneTimeCurve");
            _OneTimeButton    = serializedObject.FindProperty("OneTimeButton");

            _InitialValue = serializedObject.FindProperty("InitialValue");
            _CurrentValue = serializedObject.FindProperty("CurrentValue");

            _ChoiceIndex  = serializedObject.FindProperty("ChoiceIndex");
            _PropertyName = serializedObject.FindProperty("PropertyName");

            _AudioAnalyzer           = serializedObject.FindProperty("AudioAnalyzer");
            _BeatID                  = serializedObject.FindProperty("BeatID");
            _AudioAnalyzerMultiplier = serializedObject.FindProperty("AudioAnalyzerMultiplier");

            VerifyChosenIndex();
            AssemblyReloadEvents.afterAssemblyReload += OnAfterAssemblyReload;
        }
        /// <summary>
        /// Draws a custom conditional inspector
        /// </summary>
        public override void OnInspectorGUI()
        {
            serializedObject.Update();
            Undo.RecordObject(target, "Modified FloatController");

            FloatController myTarget = (FloatController)target;

            EditorGUILayout.PropertyField(_TargetObject);
            if (myTarget.AttributeNames != null)
            {
                if (myTarget.AttributeNames.Length > 0)
                {
                    // draws a dropdown with all our properties
                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.PrefixLabel("Property");

                    _ChoiceIndex.intValue = EditorGUILayout.Popup(myTarget.ChoiceIndex, myTarget.AttributeNames);
                    BindPropertyName();
                    EditorGUILayout.EndHorizontal();

                    Editor.DrawPropertiesExcluding(serializedObject, new string[] { "m_Script", "TargetObject", "Curve", "MinValue", "MaxValue", "Duration", "Amplitude",
                                                                                    "Frequency", "Shift", "InitialValue", "CurrentValue",
                                                                                    "OneTimeDuration", "OneTimeAmplitude", "OneTimeCurve", "OneTimeButton",
                                                                                    "AudioAnalyzer", "BeatID", "AudioAnalyzerMultiplier" });

                    if (myTarget.ControlMode == FloatController.ControlModes.PingPong)
                    {
                        EditorGUILayout.PropertyField(_Curve);
                        EditorGUILayout.PropertyField(_MinValue);
                        EditorGUILayout.PropertyField(_MaxValue);
                        EditorGUILayout.PropertyField(_Duration);
                    }
                    else if (myTarget.ControlMode == FloatController.ControlModes.Random)
                    {
                        EditorGUILayout.PropertyField(_Amplitude);
                        EditorGUILayout.PropertyField(_Frequency);
                        EditorGUILayout.PropertyField(_Shift);
                    }
                    else if (myTarget.ControlMode == FloatController.ControlModes.OneTime)
                    {
                        EditorGUILayout.PropertyField(_OneTimeDuration);
                        EditorGUILayout.PropertyField(_OneTimeAmplitude);
                        EditorGUILayout.PropertyField(_OneTimeCurve);
                        EditorGUILayout.PropertyField(_OneTimeButton);
                    }
                    else if (myTarget.ControlMode == FloatController.ControlModes.AudioAnalyzer)
                    {
                        EditorGUILayout.PropertyField(_AudioAnalyzer);
                        EditorGUILayout.PropertyField(_BeatID);
                        EditorGUILayout.PropertyField(_AudioAnalyzerMultiplier);
                    }

                    EditorGUILayout.PropertyField(_InitialValue);
                    EditorGUILayout.PropertyField(_CurrentValue);
                }
            }


            serializedObject.ApplyModifiedProperties();
        }
        protected virtual void OnAfterAssemblyReload()
        {
            FloatController myTarget = (FloatController)target;

            myTarget.FillDropDownList();
            VerifyChosenIndex();
            serializedObject.ApplyModifiedProperties();
        }
        /// <summary>
        /// On enable, grabs our serialized properties
        /// </summary>
        protected virtual void OnEnable()
        {
            FloatController myTarget = (FloatController)target;

            _TargetObject = serializedObject.FindProperty("TargetObject");

            _Curve    = serializedObject.FindProperty("Curve");
            _MinValue = serializedObject.FindProperty("MinValue");
            _MaxValue = serializedObject.FindProperty("MaxValue");
            _Duration = serializedObject.FindProperty("Duration");
            _PingPongPauseDuration = serializedObject.FindProperty("PingPongPauseDuration");

            _Amplitude        = serializedObject.FindProperty("Amplitude");
            _Frequency        = serializedObject.FindProperty("Frequency");
            _Shift            = serializedObject.FindProperty("Shift");
            _RemapNoiseValues = serializedObject.FindProperty("RemapNoiseValues");
            _RemapNoiseZero   = serializedObject.FindProperty("RemapNoiseZero");
            _RemapNoiseOne    = serializedObject.FindProperty("RemapNoiseOne");

            _OneTimeDuration               = serializedObject.FindProperty("OneTimeDuration");
            _OneTimeAmplitude              = serializedObject.FindProperty("OneTimeAmplitude");
            _OneTimeRemapMin               = serializedObject.FindProperty("OneTimeRemapMin");
            _OneTimeRemapMax               = serializedObject.FindProperty("OneTimeRemapMax");
            _OneTimeCurve                  = serializedObject.FindProperty("OneTimeCurve");
            _DisableAfterOneTime           = serializedObject.FindProperty("DisableAfterOneTime");
            _DisableGameObjectAfterOneTime = serializedObject.FindProperty("DisableGameObjectAfterOneTime");
            _OneTimeButton                 = serializedObject.FindProperty("OneTimeButton");

            _DrivenLevel = serializedObject.FindProperty("DrivenLevel");

            _ToDestinationValue        = serializedObject.FindProperty("ToDestinationValue");
            _ToDestinationDuration     = serializedObject.FindProperty("ToDestinationDuration");
            _ToDestinationCurve        = serializedObject.FindProperty("ToDestinationCurve");
            _DisableAfterToDestination = serializedObject.FindProperty("DisableAfterToDestination");
            _ToDestinationButton       = serializedObject.FindProperty("ToDestinationButton");

            _InitialValue           = serializedObject.FindProperty("InitialValue");
            _CurrentValue           = serializedObject.FindProperty("CurrentValue");
            _CurrentValueNormalized = serializedObject.FindProperty("CurrentValueNormalized");

            _ChoiceIndex  = serializedObject.FindProperty("ChoiceIndex");
            _PropertyName = serializedObject.FindProperty("PropertyName");

            _AudioAnalyzer           = serializedObject.FindProperty("AudioAnalyzer");
            _AudioAnalyzerMode       = serializedObject.FindProperty("AudioAnalyzerMode");
            _NormalizedLevelID       = serializedObject.FindProperty("NormalizedLevelID");
            _BeatID                  = serializedObject.FindProperty("BeatID");
            _AudioAnalyzerMultiplier = serializedObject.FindProperty("AudioAnalyzerMultiplier");

            VerifyChosenIndex();
            AssemblyReloadEvents.afterAssemblyReload += OnAfterAssemblyReload;
        }
        protected virtual void BindPropertyName()
        {
            FloatController myTarget = (FloatController)target;

            if (myTarget.ChoiceIndex > myTarget.AttributeNames.Length - 1)
            {
                _ChoiceIndex.intValue     = 0;
                _PropertyName.stringValue = FloatController._undefinedString;
            }
            else
            {
                _PropertyName.stringValue = myTarget.AttributeNames[myTarget.ChoiceIndex];
                serializedObject.ApplyModifiedProperties();
            }
        }
        protected virtual void VerifyChosenIndex()
        {
            FloatController myTarget = (FloatController)target;

            // determine choice index
            int  index = 0;
            bool found = false;

            foreach (string attName in myTarget.AttributeNames)
            {
                if (attName == myTarget.PropertyName)
                {
                    _ChoiceIndex.intValue = index;
                    found = true;
                }
                index++;
            }
            if (!found)
            {
                _ChoiceIndex.intValue     = 0;
                _PropertyName.stringValue = FloatController._undefinedString;
            }
            serializedObject.ApplyModifiedProperties();
        }
        /// <summary>
        /// Draws a custom conditional inspector
        /// </summary>
        public override void OnInspectorGUI()
        {
            serializedObject.Update();
            Undo.RecordObject(target, "Modified FloatController");

            FloatController myTarget = (FloatController)target;

            EditorGUILayout.PropertyField(_TargetObject);
            if (myTarget.AttributeNames != null)
            {
                if (myTarget.AttributeNames.Length > 0)
                {
                    // draws a dropdown with all our properties
                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.PrefixLabel("Property");

                    _ChoiceIndex.intValue = EditorGUILayout.Popup(myTarget.ChoiceIndex, myTarget.AttributeNames);
                    BindPropertyName();
                    EditorGUILayout.EndHorizontal();

                    Editor.DrawPropertiesExcluding(serializedObject, new string[] { "m_Script", "TargetObject", "Curve", "MinValue", "MaxValue", "Duration", "Amplitude",
                                                                                    "RemapNoiseValues", "RemapNoiseZero", "RemapNoiseOne",
                                                                                    "Frequency", "Shift", "InitialValue", "CurrentValue", "CurrentValueNormalized", "PingPongPauseDuration",
                                                                                    "OneTimeDuration", "OneTimeAmplitude", "OneTimeRemapMin", "OneTimeRemapMax",
                                                                                    "OneTimeCurve", "OneTimeButton", "DisableAfterOneTime", "DisableGameObjectAfterOneTime",
                                                                                    "AudioAnalyzer", "BeatID", "AudioAnalyzerMultiplier", "DisableAfterToDestination", "DrivenLevel",
                                                                                    "ToDestinationDuration", "ToDestinationValue", "ToDestinationCurve", "ToDestinationButton" });

                    if (myTarget.ControlMode == FloatController.ControlModes.PingPong)
                    {
                        EditorGUILayout.PropertyField(_Curve);
                        EditorGUILayout.PropertyField(_MinValue);
                        EditorGUILayout.PropertyField(_MaxValue);
                        EditorGUILayout.PropertyField(_Duration);
                        EditorGUILayout.PropertyField(_PingPongPauseDuration);
                    }
                    else if (myTarget.ControlMode == FloatController.ControlModes.Random)
                    {
                        EditorGUILayout.PropertyField(_Amplitude);
                        EditorGUILayout.PropertyField(_Frequency);
                        EditorGUILayout.PropertyField(_Shift);
                        EditorGUILayout.PropertyField(_RemapNoiseValues);
                        EditorGUILayout.PropertyField(_RemapNoiseZero);
                        EditorGUILayout.PropertyField(_RemapNoiseOne);
                    }
                    else if (myTarget.ControlMode == FloatController.ControlModes.Driven)
                    {
                        EditorGUILayout.PropertyField(_DrivenLevel);
                    }
                    else if (myTarget.ControlMode == FloatController.ControlModes.OneTime)
                    {
                        EditorGUILayout.PropertyField(_OneTimeDuration);
                        EditorGUILayout.PropertyField(_OneTimeAmplitude);
                        EditorGUILayout.PropertyField(_OneTimeRemapMin);
                        EditorGUILayout.PropertyField(_OneTimeRemapMax);
                        EditorGUILayout.PropertyField(_OneTimeCurve);
                        EditorGUILayout.PropertyField(_DisableAfterOneTime);
                        EditorGUILayout.PropertyField(_DisableGameObjectAfterOneTime);
                        EditorGUILayout.PropertyField(_OneTimeButton);
                    }
                    else if (myTarget.ControlMode == FloatController.ControlModes.AudioAnalyzer)
                    {
                        EditorGUILayout.PropertyField(_AudioAnalyzer);
                        EditorGUILayout.PropertyField(_AudioAnalyzerMode);
                        if (myTarget.AudioAnalyzerMode == FloatController.AudioAnalyzerModes.Beat)
                        {
                            EditorGUILayout.PropertyField(_BeatID);
                        }
                        else
                        {
                            EditorGUILayout.PropertyField(_NormalizedLevelID);
                        }
                        EditorGUILayout.PropertyField(_AudioAnalyzerMultiplier);
                    }
                    else if (myTarget.ControlMode == FloatController.ControlModes.ToDestination)
                    {
                        EditorGUILayout.PropertyField(_ToDestinationDuration);
                        EditorGUILayout.PropertyField(_ToDestinationValue);
                        EditorGUILayout.PropertyField(_ToDestinationCurve);
                        EditorGUILayout.PropertyField(_DisableAfterToDestination);
                        EditorGUILayout.PropertyField(_ToDestinationButton);
                    }

                    EditorGUILayout.PropertyField(_InitialValue);
                    EditorGUILayout.PropertyField(_CurrentValue);
                    EditorGUILayout.PropertyField(_CurrentValueNormalized);
                }
            }


            serializedObject.ApplyModifiedProperties();

            if (Application.isPlaying)
            {
                _barRect = EditorGUILayout.GetControlRect();
                DrawLevelProgressBar(_barRect, myTarget.CurrentValueNormalized, _mmYellow, _mmRed);
            }
        }