private static void SetSoundResource(SoundParam param)
        {
            param.source_ = SoundResources.GetAudioSource(param.category_id_);

            param.source_.clip   = param.clip_;
            param.source_.volume = param.volume_;
            param.source_.loop   = param.loop_;

            sound_play_list_[param.category_id_].Add(param);
        }
        private static void Stop(SoundParam param)
        {
            param.source_.Stop();

            if (param.onFinish != null)
            {
                param.onFinish();
            }

            param.source_.clip = null;
        }
        private static SoundParam GetSoundParam(string file_name, int category_id)
        {
            List <SoundParam> category_play_list = sound_play_list_[category_id];

            Debug.Assert(category_play_list != null, "The category doesn't exist!!!");

            SoundParam param = category_play_list.Find((par) => { return(par.file_name_ == file_name); });

            Debug.Assert(param != null, "The filename doesn't exist !!!!");

            return(param);
        }
        public static void UnPause(string file_name, int category_id)
        {
            SoundParam param = GetSoundParam(file_name, category_id);

            if (param.source_.isPlaying || param.is_pause_)
            {
                param.source_.UnPause();
                param.is_pause_ = false;
            }
            else
            {
                Debug.LogWarning("Can't unpause!!!");
            }
        }
        public static void Play(SoundParam param)
        {
            Debug.Assert(param != null, "Param is null!!!!!");

            SetSoundResource(param);

            if (param.is_oneshot_)
            {
                param.source_.PlayOneShot(param.clip_, param.volume_);
                mono_behaviour_.StartCoroutine(StopDetect(param));
            }
            else
            {
                param.source_.Play();
            }
        }
        public static void Stop(string file_name, int category_id, float fade_time = 0.0f)
        {
            List <SoundParam> category_play_list = sound_play_list_[category_id];

            Debug.Assert(category_play_list != null, "The category doesn't exist !!!!");

            SoundParam param = category_play_list.Find((par) => { return(par.file_name_ == file_name); });

            Debug.Assert(param != null, "The filename doesn't exist !!!!");

            mono_behaviour_.StartCoroutine(FadeOut(param, fade_time,
                                                   () => {
                category_play_list.Remove(param);
                if (param.onFinish != null)
                {
                    param.onFinish();
                }
            }));
        }
        private static IEnumerator StopDetect(SoundParam param)
        {
            Debug.Assert(param != null, "param is null!!!!!");

            while (param.source_.isPlaying || param.is_pause_)
            {
                yield return(null);
            }

            List <SoundParam> category_play_list = sound_play_list_[param.category_id_];

            param.source_.clip = null;

            if (param.onFinish != null)
            {
                param.onFinish();
            }

            category_play_list.Remove(param);
        }
        public void Play(string file_name, bool loop, bool one_shot, System.Action onFinish = null, float volume = 1.0f)
        {
            Debug.Assert(!string.IsNullOrEmpty(file_name), "filename is empty!!!!");

            SoundParam param = new SoundParam();

            AudioClip clip = Resources.Load <AudioClip>(path_ + file_name);

            Debug.Assert(clip != null, file_name + " doesn't exist!!!!");

            param.clip_        = clip;
            param.file_name_   = file_name;
            param.loop_        = loop;
            param.is_oneshot_  = one_shot;
            param.volume_      = volume;
            param.category_id_ = category_id_;
            param.onFinish     = onFinish;

            SoundSystem.Play(param);
        }
        private static IEnumerator FadeOut(SoundParam param, float fade_time, System.Action onFinish = null)
        {
            if (fade_time > 0.0f)
            {
                float frame_count_ = param.source_.volume / (fade_time * SoundSettings.frame_rate_);

                while (param.source_.volume > 0.0f)
                {
                    param.source_.volume -= frame_count_;
                    yield return(null);
                }
            }

            param.source_.Stop();
            param.source_.clip = null;

            if (onFinish != null)
            {
                onFinish();
            }
        }