public override void OnInspectorGUI()
    {
        if (!metaTarget)
        {
            EditorGUILayout.HelpBox("AudioAssistant is missing", MessageType.Error);
            return;
        }
        main = (AudioAssistant)metaTarget;
        Undo.RecordObject(main, "");

        main.musicVolume = EditorGUILayout.Slider("Music Volume", main.musicVolume, 0f, 1f);

        if (main.tracks == null)
        {
            main.tracks = new List <AudioAssistant.MusicTrack>();
        }

        if (main.sounds == null)
        {
            main.sounds = new List <AudioAssistant.Sound>();
        }

        #region Music Tracks
        tracksFade.target = GUILayout.Toggle(tracksFade.target, "Music Tracks", EditorStyles.foldout);

        if (EditorGUILayout.BeginFadeGroup(tracksFade.faded))
        {
            EditorGUILayout.BeginVertical(EditorStyles.textArea);

            EditorGUILayout.BeginHorizontal();

            GUILayout.Space(20);
            GUILayout.Label("Name", EditorStyles.centeredGreyMiniLabel, GUILayout.Width(100));
            GUILayout.Label("Audio Clip", EditorStyles.centeredGreyMiniLabel, GUILayout.ExpandWidth(true));

            EditorGUILayout.EndHorizontal();

            foreach (AudioAssistant.MusicTrack track in main.tracks)
            {
                EditorGUILayout.BeginHorizontal();

                if (GUILayout.Button("X", GUILayout.Width(20)))
                {
                    main.tracks.Remove(track);
                    break;
                }
                track.name  = EditorGUILayout.TextField(track.name, GUILayout.Width(100));
                track.track = (AudioClip)EditorGUILayout.ObjectField(track.track, typeof(AudioClip), false, GUILayout.ExpandWidth(true));

                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button("Add", GUILayout.Width(60)))
            {
                main.tracks.Add(new AudioAssistant.MusicTrack());
            }

            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();
        }
        EditorGUILayout.EndFadeGroup();
        #endregion

        #region Sounds
        iapsFade.target = GUILayout.Toggle(iapsFade.target, "Sounds", EditorStyles.foldout);

        if (EditorGUILayout.BeginFadeGroup(iapsFade.faded))
        {
            EditorGUILayout.BeginVertical(EditorStyles.textArea);

            EditorGUILayout.BeginHorizontal();

            GUILayout.Space(20);
            GUILayout.Label("Edit", EditorStyles.centeredGreyMiniLabel, GUILayout.Width(40));
            GUILayout.Label("Name", EditorStyles.centeredGreyMiniLabel, GUILayout.Width(120));
            GUILayout.Label("Audio Clips", EditorStyles.centeredGreyMiniLabel, GUILayout.ExpandWidth(true));

            EditorGUILayout.EndHorizontal();

            foreach (AudioAssistant.Sound sound in main.sounds)
            {
                EditorGUILayout.BeginHorizontal();

                if (GUILayout.Button("X", GUILayout.Width(20)))
                {
                    main.sounds.Remove(sound);
                    break;
                }
                if (GUILayout.Button("Edit", GUILayout.Width(40)))
                {
                    if (edit == sound)
                    {
                        edit = null;
                    }
                    else
                    {
                        edit = sound;
                    }
                }

                sound.name = EditorGUILayout.TextField(sound.name, GUILayout.Width(120));

                if (edit == sound || sound.clips.Count == 0)
                {
                    EditorGUILayout.BeginVertical();
                    for (int i = 0; i < sound.clips.Count; i++)
                    {
                        sound.clips[i] = (AudioClip)EditorGUILayout.ObjectField(sound.clips[i], typeof(AudioClip), false, GUILayout.ExpandWidth(true));
                        if (sound.clips[i] == null)
                        {
                            sound.clips.RemoveAt(i);
                            break;
                        }
                    }
                    AudioClip new_clip = (AudioClip)EditorGUILayout.ObjectField(null, typeof(AudioClip), false, GUILayout.Width(150));
                    if (new_clip)
                    {
                        sound.clips.Add(new_clip);
                    }
                    EditorGUILayout.EndVertical();
                }
                else
                {
                    GUILayout.Label(sound.clips.Count.ToString() + " audio clip(s)", EditorStyles.miniBoldLabel);
                }


                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button("Add", GUILayout.Width(60)))
            {
                main.sounds.Add(new AudioAssistant.Sound());
                edit = main.sounds[main.sounds.Count - 1];
            }
            if (GUILayout.Button("Sort", GUILayout.Width(60)))
            {
                main.sounds.Sort((AudioAssistant.Sound a, AudioAssistant.Sound b) => {
                    return(string.Compare(a.name, b.name));
                });
                foreach (AudioAssistant.Sound sound in main.sounds)
                {
                    sound.clips.Sort((AudioClip a, AudioClip b) => {
                        return(string.Compare(a.ToString(), b.ToString()));
                    });
                }
            }

            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();
        }
        EditorGUILayout.EndFadeGroup();
        #endregion
    }
    public override void OnInspectorGUI()
    {
        main = (AudioAssistant) target;
        Undo.RecordObject (main, "");

        main.musicVolume = EditorGUILayout.Slider("Music Volume", main.musicVolume, 0f, 1f);

        if (main.tracks == null)
            main.tracks = new List<AudioAssistant.MusicTrack>();

        if (main.sounds == null)
            main.sounds = new List<AudioAssistant.Sound>();

        #region Music Tracks
        tracksFade.target = GUILayout.Toggle(tracksFade.target, "Music Tracks", EditorStyles.foldout);

        if (EditorGUILayout.BeginFadeGroup(tracksFade.faded)) {

            EditorGUILayout.BeginHorizontal();

            GUILayout.Space(20);
            GUILayout.Label("Name", GUILayout.Width(100));
            GUILayout.Label("Audio Clip", GUILayout.ExpandWidth(true));

            EditorGUILayout.EndHorizontal();

            foreach (AudioAssistant.MusicTrack track in main.tracks) {
                EditorGUILayout.BeginHorizontal();

                if (GUILayout.Button("X", GUILayout.Width(20))) {
                    main.tracks.Remove(track);
                    break;
                }
                track.name = EditorGUILayout.TextField(track.name, GUILayout.Width(100));
                track.track = (AudioClip) EditorGUILayout.ObjectField(track.track, typeof(AudioClip), false, GUILayout.ExpandWidth(true));

                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button("Add", GUILayout.Width(60)))
                main.tracks.Add(new AudioAssistant.MusicTrack());

            EditorGUILayout.EndHorizontal();
        }
        EditorGUILayout.EndFadeGroup();
        #endregion

        #region Sounds
        iapsFade.target = GUILayout.Toggle(iapsFade.target, "Sounds", EditorStyles.foldout);

        if (EditorGUILayout.BeginFadeGroup(iapsFade.faded)) {

            EditorGUILayout.BeginHorizontal();

            GUILayout.Space(20);
            GUILayout.Space(40);
            GUILayout.Label("Name", GUILayout.Width(120));
            GUILayout.Label("Audio Clips", GUILayout.ExpandWidth(true));

            EditorGUILayout.EndHorizontal();

            foreach (AudioAssistant.Sound sound in main.sounds) {
                EditorGUILayout.BeginHorizontal();

                if (GUILayout.Button("X", GUILayout.Width(20))) {
                    main.sounds.Remove(sound);
                    break;
                }
                if (GUILayout.Button("Edit", GUILayout.Width(40))) {
                    if (edit == sound)
                        edit = null;
                    else
                        edit = sound;
                }

                sound.name = EditorGUILayout.TextField(sound.name, GUILayout.Width(120));

                if (edit == sound || sound.clips.Count == 0) {
                    EditorGUILayout.BeginVertical();
                    for (int i = 0; i < sound.clips.Count; i++) {
                        sound.clips[i] = (AudioClip) EditorGUILayout.ObjectField(sound.clips[i], typeof(AudioClip), false, GUILayout.ExpandWidth(true));
                        if (sound.clips[i] == null) {
                            sound.clips.RemoveAt(i);
                           break;
                        }
                    }
                    AudioClip new_clip = (AudioClip) EditorGUILayout.ObjectField(null, typeof(AudioClip), false, GUILayout.Width(150));
                    if (new_clip)
                        sound.clips.Add(new_clip);
                    EditorGUILayout.EndVertical();
                } else {
                    GUILayout.Label(sound.clips.Count.ToString() + " audio clip(s)", EditorStyles.miniBoldLabel);
                }

                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button("Add", GUILayout.Width(60))) {
                main.sounds.Add(new AudioAssistant.Sound());
                edit = main.sounds[main.sounds.Count - 1];
            }
            if (GUILayout.Button("Sort", GUILayout.Width(60))) {
                main.sounds.Sort((AudioAssistant.Sound a, AudioAssistant.Sound b) => {
                    return string.Compare(a.name, b.name);
                });
                foreach (AudioAssistant.Sound sound in main.sounds)
                    sound.clips.Sort((AudioClip a, AudioClip b) => {
                        return string.Compare(a.ToString(), b.ToString());
                    });
            }

            EditorGUILayout.EndHorizontal();
        }
        EditorGUILayout.EndFadeGroup();
        #endregion
    }