| using System.Collections; | 
| using System.Collections.Generic; | 
| using UnityEngine; | 
|   | 
| using System; | 
|   | 
| public class SoundPlayer : MonoBehaviour | 
| { | 
|     public static readonly int defaultClickPositiveAudio = 1; | 
|     public static readonly int defaultClickNegativeAudio = 2; | 
|   | 
|     static readonly List<int> commonUseAudioSet = new List<int>() { defaultClickPositiveAudio, defaultClickNegativeAudio, 3, 4 }; | 
|   | 
|     public static SoundPlayer Instance { | 
|         get; set; | 
|     } | 
|   | 
|     [SerializeField] AudioSource m_MusicAudioSource; | 
|     public AudioSource musicAudioSource { get { return m_MusicAudioSource; } } | 
|   | 
|     [SerializeField] AudioSource m_UIAudioSource; | 
|     [SerializeField] AudioSource m_NewBieAudioSource; | 
|     [SerializeField] AudioSource m_NpcAudioSource; | 
|   | 
|     Dictionary<int, AudioClip> commonUseAudioClipDict = new Dictionary<int, AudioClip>(); | 
|     Dictionary<int, AudioClip> musicAudioClipDict = new Dictionary<int, AudioClip>(); | 
|   | 
|     public event Action<bool> muteEvent; | 
|     bool m_Mute = false; | 
|     public bool mute { | 
|         get { return m_Mute; } | 
|         set { | 
|             m_Mute = value; | 
|             m_MusicAudioSource.mute = m_Mute; | 
|             m_NewBieAudioSource.mute = m_Mute; | 
|             m_NpcAudioSource.mute = m_Mute; | 
|   | 
|             if (muteEvent != null) | 
|             { | 
|                 muteEvent(m_Mute); | 
|             } | 
|         } | 
|     } | 
|   | 
|     public static void CreateSoundPlayer() | 
|     { | 
|         var gameObject = GameObject.Instantiate(BuiltInLoader.LoadPrefab("SoundPlayer")); | 
|         Instance = gameObject.GetComponent<SoundPlayer>(); | 
|         Instance.name = "SoundPlayer"; | 
|         Instance.SetActive(true); | 
|         DontDestroyOnLoad(gameObject); | 
|     } | 
|   | 
|     public void PlayBackGroundMusic(int _audioId) | 
|     { | 
|         if (_audioId <= 0) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         backGroudAudioIdRef = _audioId; | 
|         AudioClip clip = null; | 
|         if (!commonUseAudioClipDict.TryGetValue(_audioId, out clip)) | 
|         { | 
|             var config = AudioConfig.Get(_audioId); | 
|             if (config != null) | 
|             { | 
|                 AudioLoader.LoadAudioAsync(config.Folder, config.Audio, (bool _ok, UnityEngine.Object _object) => | 
|                 { | 
|                     if (_ok && _object != null) | 
|                     { | 
|                         clip = _object as AudioClip; | 
|                         if (clip != null) | 
|                         { | 
|                             if (!musicAudioClipDict.ContainsKey(_audioId)) | 
|                             { | 
|                                 musicAudioClipDict[_audioId] = clip; | 
|                             } | 
|   | 
|                             StartCoroutine(Co_BackGroundMusicFadeOutIn(clip, false)); | 
|                         } | 
|                     } | 
|                 }); | 
|             } | 
|         } | 
|         else | 
|         { | 
|             if (clip != null) | 
|             { | 
|                 StartCoroutine(Co_BackGroundMusicFadeOutIn(clip, false)); | 
|             } | 
|         } | 
|     } | 
|   | 
|     int backGroudAudioIdRef = 0; | 
|     public void PlayBackGroundMusicOneShot(int _audioId) | 
|     { | 
|         var config = AudioConfig.Get(_audioId); | 
|         if (config == null) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         var clip = AudioLoader.LoadAudio(config.Folder, config.Audio); | 
|         if (clip == null) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         var second = clip.length; | 
|         StartCoroutine(Co_BackGroundMusicFadeOutIn(clip, true)); | 
|   | 
|         if (backGroudAudioIdRef != 0) | 
|         { | 
|             StartCoroutine(Co_DelayPlayBackGrondMusic(second, backGroudAudioIdRef)); | 
|         } | 
|     } | 
|   | 
|     public void StopBackGroundMusic() | 
|     { | 
|         backGroudAudioIdRef = 0; | 
|         StartCoroutine(Co_BackGroundMusicFadeOut()); | 
|     } | 
|   | 
|     public void UnLoadMusic(int _exclude) | 
|     { | 
|         if (AssetSource.isUseAssetBundle && DeviceUtility.IsLowMemory()) | 
|         { | 
|             foreach (var key in musicAudioClipDict.Keys) | 
|             { | 
|                 if (key != _exclude) | 
|                 { | 
|                     var config = AudioConfig.Get(key); | 
|                     ResManager.Instance.UnloadAsset("Audio/" + config.Folder, config.Audio); | 
|                 } | 
|             } | 
|   | 
|             var keys = new List<int>(musicAudioClipDict.Keys); | 
|             for (int i = 0; i < keys.Count; i++) | 
|             { | 
|                 if (keys[i] != _exclude) | 
|                 { | 
|                     musicAudioClipDict.Remove(keys[i]); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     public void PlayUIAudio(int _audioId) | 
|     { | 
|         if (_audioId <= 0) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         AudioClip clip = null; | 
|         if (!commonUseAudioClipDict.TryGetValue(_audioId, out clip)) | 
|         { | 
|             var config = AudioConfig.Get(_audioId); | 
|             if (config != null) | 
|             { | 
|                 clip = AudioLoader.LoadAudio(config.Folder, config.Audio); | 
|                 if (clip != null) | 
|                 { | 
|                     if (commonUseAudioSet.Contains(_audioId)) | 
|                     { | 
|                         commonUseAudioClipDict[_audioId] = clip; | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|   | 
|         if (clip != null) | 
|         { | 
|             m_UIAudioSource.volume = SystemSetting.Instance.GetSoundEffect(); | 
|             if (m_UIAudioSource.isPlaying) | 
|             { | 
|                 m_UIAudioSource.Stop(); | 
|             } | 
|             m_UIAudioSource.PlayOneShot(clip); | 
|         } | 
|     } | 
|   | 
|     public void StopUIAudio() | 
|     { | 
|         if (m_UIAudioSource.isPlaying) | 
|         { | 
|             m_UIAudioSource.Stop(); | 
|         } | 
|     } | 
|   | 
|     public void PlayAudio(AudioSource _source, int _audioId) | 
|     { | 
|         if (_audioId <= 0) | 
|         { | 
|             return; | 
|         } | 
|          | 
|         if (!_source) | 
|         { | 
|             return; | 
|         } | 
|          | 
|         AudioClip clip = null; | 
|         if (!commonUseAudioClipDict.TryGetValue(_audioId, out clip)) | 
|         { | 
|             var config = AudioConfig.Get(_audioId); | 
|             if (config != null) | 
|             { | 
|                 clip = AudioLoader.LoadAudio(config.Folder, config.Audio); | 
|                 if (clip != null) | 
|                 { | 
|                     if (commonUseAudioSet.Contains(_audioId)) | 
|                     { | 
|                         commonUseAudioClipDict[_audioId] = clip; | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|   | 
|         if (clip != null) | 
|         { | 
|             _source.volume = SystemSetting.Instance.GetSoundEffect() * 1f; | 
|             //  TODO YYL | 
|                 // (WindowCenter.Instance.ExistAnyFullScreenOrMaskWin() ? GeneralDefine.audioScaleWhenFullScreenOn : 1f); | 
|   | 
|             _source.PlayOneShot(clip); | 
|         } | 
|     } | 
|   | 
|     public void PlayAudio(AudioClip _clip) | 
|     { | 
|         if (_clip != null) | 
|         { | 
|             m_UIAudioSource.volume = SystemSetting.Instance.GetSoundEffect(); | 
|             if (m_UIAudioSource.isPlaying) | 
|             { | 
|                 m_UIAudioSource.Stop(); | 
|             } | 
|             m_UIAudioSource.PlayOneShot(_clip); | 
|         } | 
|     } | 
|   | 
|     public void PlayNewBieAudio(int _audioId) | 
|     { | 
|         if (_audioId <= 0) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         AudioClip clip = null; | 
|         var config = AudioConfig.Get(_audioId); | 
|         if (config != null) | 
|         { | 
|             clip = AudioLoader.LoadAudio(config.Folder, config.Audio); | 
|         } | 
|   | 
|         if (clip != null) | 
|         { | 
|             m_NewBieAudioSource.volume = SystemSetting.Instance.GetSoundEffect(); | 
|             if (m_NewBieAudioSource.isPlaying) | 
|             { | 
|                 m_NewBieAudioSource.Stop(); | 
|             } | 
|   | 
|             if (m_NpcAudioSource.isPlaying) | 
|             { | 
|                 m_NpcAudioSource.Stop(); | 
|             } | 
|             m_NewBieAudioSource.PlayOneShot(clip); | 
|         } | 
|     } | 
|   | 
|     public void PlayNpcAudio(int _audioId) | 
|     { | 
|         if (_audioId <= 0) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         AudioClip clip = null; | 
|         var config = AudioConfig.Get(_audioId); | 
|         if (config != null) | 
|         { | 
|             clip = AudioLoader.LoadAudio(config.Folder, config.Audio); | 
|         } | 
|   | 
|         if (clip != null) | 
|         { | 
|             m_NpcAudioSource.volume = SystemSetting.Instance.GetSoundEffect(); | 
|             if (m_NpcAudioSource.isPlaying) | 
|             { | 
|                 m_NpcAudioSource.Stop(); | 
|             } | 
|   | 
|             if (m_NewBieAudioSource.isPlaying) | 
|             { | 
|                 m_NewBieAudioSource.Stop(); | 
|             } | 
|   | 
|             m_NpcAudioSource.PlayOneShot(clip); | 
|         } | 
|     } | 
|   | 
|     //public void PlayLoginMusic() | 
|     //{ | 
|     //    var loginMusic = BuiltInLoader.LoadMusic("Music_Login"); | 
|     //    if (!m_MusicAudioSource.isPlaying || m_MusicAudioSource.clip != loginMusic) | 
|     //    { | 
|     //        StartCoroutine(Co_BackGroundMusicFadeOutIn(loginMusic, false)); | 
|     //    } | 
|     //} | 
|   | 
|     //private void LateUpdate() | 
|     //{  | 
|     //    if (CameraController.Instance != null && CameraController.Instance.CameraObject != null)  | 
|     //    {  | 
|     //        this.transform.position = CameraController.Instance.transform.position + new Vector3(0, 5, 0);  | 
|     //        this.transform.rotation = CameraController.Instance.CameraObject.transform.rotation;  | 
|     //    } | 
|     //} | 
|   | 
|     IEnumerator Co_BackGroundMusicFadeOutIn(AudioClip _clip, bool _oneShot) | 
|     { | 
|         var timer = 0f; | 
|         var startVolume = 0f; | 
|         var toVolume = 0f; | 
|   | 
|         if (m_MusicAudioSource.isPlaying) | 
|         { | 
|             timer = 0f; | 
|             startVolume = SystemSetting.Instance.GetSoundVolume(); | 
|             toVolume = 0f; | 
|   | 
|             while (timer < 0.5f) | 
|             { | 
|                 timer += Time.deltaTime; | 
|                 m_MusicAudioSource.volume = Mathf.Lerp(startVolume, toVolume, Mathf.Clamp01(timer / 0.5f)); | 
|                 yield return null; | 
|             } | 
|   | 
|             m_MusicAudioSource.Stop(); | 
|         } | 
|   | 
|         if (_oneShot) | 
|         { | 
|             m_MusicAudioSource.PlayOneShot(_clip); | 
|         } | 
|         else | 
|         { | 
|             m_MusicAudioSource.clip = _clip; | 
|             m_MusicAudioSource.Play(); | 
|         } | 
|   | 
|         timer = 0f; | 
|         startVolume = 0f; | 
|         toVolume = SystemSetting.Instance.GetSoundVolume(); | 
|         while (timer < 0.5f) | 
|         { | 
|             timer += Time.deltaTime; | 
|             m_MusicAudioSource.volume = Mathf.Lerp(startVolume, toVolume, Mathf.Clamp01(timer / 0.5f)); | 
|             yield return null; | 
|         } | 
|     } | 
|   | 
|     IEnumerator Co_BackGroundMusicFadeOut() | 
|     { | 
|         if (m_MusicAudioSource.isPlaying) | 
|         { | 
|             var timer = 0f; | 
|             var startVolume = SystemSetting.Instance.GetSoundVolume(); | 
|             var toVolume = 0f; | 
|   | 
|             while (timer < 1f) | 
|             { | 
|                 timer += Time.deltaTime; | 
|                 m_MusicAudioSource.volume = Mathf.Lerp(startVolume, toVolume, timer); | 
|                 yield return null; | 
|             } | 
|   | 
|             m_MusicAudioSource.Stop(); | 
|         } | 
|     } | 
|   | 
|     IEnumerator Co_DelayPlayBackGrondMusic(float _delay, int _audioId) | 
|     { | 
|         yield return new WaitForSeconds(_delay); | 
|         PlayBackGroundMusic(_audioId); | 
|     } | 
| } |