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);
|
}
|
}
|