public static ReverbSettings SaveSettings(ReverbSettings toSave)
    {
        if (toSave != null)
        {
            ReverbSettings   newSettings  = ReverbSettings.Create(toSave);
            GlobalReverbZone globalReverb = GameObject.FindObjectOfType(typeof(GlobalReverbZone)) as GlobalReverbZone;

            newSettings.beforeSerializePresets();
#if UNITY_EDITOR
            string settingsAssetPath = ReverbSettings.GetSettingsAssetPath();
            if (AssetDatabase.Contains(toSave) == true)
            {
                AssetDatabase.DeleteAsset(settingsAssetPath);
            }
            AssetDatabase.CreateAsset(newSettings, settingsAssetPath);
            AssetDatabase.SaveAssets();

            if (globalReverb != null)
            {
                newSettings.afterDeserializePresets();
                globalReverb.settings  = newSettings;
                LOADED_REVERB_SETTINGS = globalReverb.settings;
                if (EditorApplication.isPlaying || EditorApplication.isPaused)
                {
                    FmodEventSystem.GetReverbManager().UpdateGlobalReverb();
                }
            }
#endif
        }
        else
        {
            Debug.LogError("FMOD_Unity: ReverbSettings: Null reverb settings");
        }
        return(LOADED_REVERB_SETTINGS);
    }
    public static ReverbSettings Create(ReverbSettings src)
    {
        if (src != null && src.PRESETS != null)
        {
            ReverbSettings   reverbSettings = ScriptableObject.CreateInstance(typeof(ReverbSettings)) as ReverbSettings;
            int              nbPresets      = src.PRESETS.Length;
            GlobalReverbZone globalReverb   = GameObject.FindObjectOfType(typeof(GlobalReverbZone)) as GlobalReverbZone;
            GameObject       obj            = null;

            reverbSettings.SelectedPreset = src.SelectedPreset;
            reverbSettings.PRESETS        = new ReverbSettings.FmodReverbPreset[nbPresets];
            for (int i = 0; i < nbPresets; i++)
            {
                reverbSettings.PRESETS[i]            = new FmodReverbPreset();
                reverbSettings.PRESETS[i].Name       = src.PRESETS[i].Name;
                reverbSettings.PRESETS[i].Properties = src.PRESETS[i].Properties;
            }
            if (globalReverb == null)
            {
                obj = GameObject.Instantiate(Resources.Load("GlobalReverbZone")) as GameObject;

                globalReverb = obj.GetComponent <GlobalReverbZone>();
            }
            if (globalReverb != null)
            {
                globalReverb.settings = reverbSettings;
            }
            return(reverbSettings);
        }
        else
        {
            return(Create());
        }
    }
    public static bool enableCreateGlobalReverb()
    {
        if (EditorApplication.isPlayingOrWillChangePlaymode)
        {
            return(false);
        }
        GlobalReverbZone obj = GameObject.FindObjectOfType(typeof(GlobalReverbZone)) as GlobalReverbZone;

        return(obj == null);
    }
    private static void LoadSettings()
    {
        GlobalReverbZone globalReverb = GameObject.FindObjectOfType(typeof(GlobalReverbZone)) as GlobalReverbZone;

        if (LOADED_REVERB_SETTINGS == null)
        {
#if UNITY_EDITOR
            UnityEngine.Object[] tmp = AssetDatabase.LoadAllAssetsAtPath(ReverbSettings.GetSettingsAssetPath());

            if (tmp.Length > 0 && tmp[0] != null)
            {
                LOADED_REVERB_SETTINGS = tmp[0] as ReverbSettings;
                if (LOADED_REVERB_SETTINGS != null)
                {
                    LOADED_REVERB_SETTINGS.afterDeserializePresets();

                    if (globalReverb == null)
                    {
                        GameObject obj = GameObject.Instantiate(Resources.Load("GlobalReverbZone")) as GameObject;
                        globalReverb = obj.GetComponent <GlobalReverbZone>();
                    }
                    if (globalReverb != null)
                    {
                        globalReverb.settings = LOADED_REVERB_SETTINGS;
                    }
                }
            }
#endif
            if (globalReverb != null && LOADED_REVERB_SETTINGS == null)
            {
                LOADED_REVERB_SETTINGS = globalReverb.settings;
                if (LOADED_REVERB_SETTINGS != null)
                {
                    LOADED_REVERB_SETTINGS.afterDeserializePresets();
                }
            }
        }
    }
    public static ReverbSettings Create()
    {
        ReverbSettings   reverbSettings = ScriptableObject.CreateInstance(typeof(ReverbSettings)) as ReverbSettings;
        GlobalReverbZone globalReverb   = GameObject.FindObjectOfType(typeof(GlobalReverbZone)) as GlobalReverbZone;
        GameObject       obj            = null;

        reverbSettings.PRESETS = new ReverbSettings.FmodReverbPreset[] {
            new FmodReverbPreset()
            {
                Properties = OFF_REVERB_PROPERTIES, Name = "Off"
            },
            new FmodReverbPreset()
            {
                Properties = GENERIC_REVERB_PROPERTIES, Name = "Generic"
            },
            new FmodReverbPreset()
            {
                Properties = PSYCHOTIC_REVERB_PROPERTIES, Name = "Psychotic"
            },
            new FmodReverbPreset()
            {
                Properties = GENERIC_REVERB_PROPERTIES, Name = "User"
            },
        };
        reverbSettings.hideFlags = HideFlags.HideInHierarchy;
        if (globalReverb == null)
        {
            obj = GameObject.Instantiate(Resources.Load("GlobalReverbZone")) as GameObject;

            globalReverb = obj.GetComponent <GlobalReverbZone>();
        }
        if (globalReverb != null)
        {
            globalReverb.settings = reverbSettings;
        }
        return(reverbSettings);
    }
    public static bool enableGlobalSettingsWindow()
    {
        GlobalReverbZone obj = GameObject.FindObjectOfType(typeof(GlobalReverbZone)) as GlobalReverbZone;

        return(obj != null);
    }