miduo_client/Assets/LuaFramework/Scripts/Manager/SoundManager.cs

402 lines
10 KiB
C#
Raw Blame History

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using LuaInterface;
using GameCore;
namespace GameLogic
{
/// <summary>
/// 윈嵐稜都
/// </summary>
public class ExtAudioClip {
/// <summary>
/// 稜槻츰
/// </summary>
public string name {
get {
if (audioClip == null) return string.Empty;
return audioClip.name;
}
}
/// <summary>
/// 稜槻栗都
/// </summary>
public AudioClip audioClip;
/// <summary>
/// 놓迦뺏
/// </summary>
/// <param name="audioClip"></param>
public void Init(AudioClip audioClip) {
this.audioClip = audioClip;
}
/// <summary>
/// 菌潼
/// </summary>
public void UnLoad() {
if (audioClip == null) return;
App.ResMgr.UnLoadAsset(audioClip.name);
}
}
/// <summary>
/// 윈嵐稜있꺄렴포
/// </summary>
public class ExtAudioSource : MonoBehaviour
{
/// <summary>
/// 稜있꺄렴都
/// </summary>
AudioSource audioSource;
public ExtAudioClip clip{get;set;}
public bool isPlaying {
get {
return audioSource.isPlaying;
}
}
public float volume {
get
{
return audioSource.volume;
}
set {
audioSource.volume = value;
}
}
public bool loop {
get
{
return audioSource.loop;
}
set
{
audioSource.loop = value;
}
}
private void Awake()
{
audioSource = this.gameObject.AddComponent<AudioSource>();
}
public void Play() {
audioSource.Play();
}
/// <summary>
/// 꺄렴
/// </summary>
/// <param name="game"></param>
/// <param name="audioClip"></param>
public void Play(ExtAudioClip clip)
{
this.clip = clip;
audioSource.clip = clip.audioClip;
audioSource.Play();
}
public void PlayOneShot(ExtAudioClip clip) {
this.clip = clip;
audioSource.clip = clip.audioClip;
audioSource.PlayOneShot(clip.audioClip);
}
/// <summary>
/// 界岺꺄렴
/// </summary>
public void Stop()
{
audioSource.Stop();
}
}
public class SoundManager : UnitySingleton<SoundManager>
{
GameCore.ObjectPool<ExtAudioClip> audioClipPool = new GameCore.ObjectPool<ExtAudioClip>(null, (toRealease) =>
{
toRealease.UnLoad();
});
/// <summary>
/// 稜있역밑
/// </summary>
const string IsPlayMusicKey = "IsPlayMusicKey";
/// <summary>
/// 稜槻역밑
/// </summary>
const string IsPlayAudioKey = "IsPlayAudioKey";
/// <summary>
/// 稜있稜좆
/// </summary>
const string MusicVolumeKey = "MusicVolumeKey";
/// <summary>
/// 稜槻稜좆
/// </summary>
const string AudioVolumeKey = "AudioVolumeKey";
/// <summary>
/// 谿珂꺄렴돨稜槻鑒좆
/// </summary>
private int aduioCount = 5;
/// <summary>
/// 교쒼稜좆
/// </summary>
private float musicVolume = 1f;
/// <summary>
/// 稜槻稜좆
/// </summary>
private float aduioVolume = 1f;
/// <summary>
/// 角뤠밑균<EBB091>
/// </summary>
private bool isPlayMusic = true;
/// <summary>
/// 角뤠밑균稜槻
/// </summary>
private bool isPlayAudio = true;
/// <summary>
/// 교쒼稜
/// </summary>
ExtAudioSource audioSource;
/// <summary>
/// 稜槻稜
/// </summary>
ExtAudioSource[] audioSources;
/// <summary>
/// 苟寧몸교쒼稜
/// </summary>
ExtAudioClip nextBGM;
/// <summary>
/// 놓迦뺏
/// </summary>
private void Awake()
{
Init();
gameObject.AddComponent<AudioListener>();
audioSources = new ExtAudioSource[aduioCount];
for (int i = 0; i < aduioCount; i++)
{
audioSources[i] = gameObject.AddComponent<ExtAudioSource>();
}
audioSource = gameObject.AddComponent<ExtAudioSource>();
audioSource.volume = 0f;
audioSource.loop = true;
nextBGM = null;
}
/// <summary>
/// 놓迦뺏
/// </summary>
private void Init()
{
isPlayMusic = PlayerPrefs.GetInt(IsPlayMusicKey, 1) == 1;
isPlayAudio = PlayerPrefs.GetInt(IsPlayAudioKey, 1) == 1;
}
private void Update()
{
if (nextBGM != null && isPlayMusic)
{
if (audioSource.clip == null || audioSource.volume <= 0)
{
if (audioSource.clip != null)
{
audioClipPool.Release(audioSource.clip);
}
audioSource.Play(nextBGM);
nextBGM = null;
}
else
{
audioSource.volume -= 0.02f;
}
}
else if (audioSource.clip != null && audioSource.volume < musicVolume && isPlayMusic)
{
if (!audioSource.isPlaying) audioSource.Play();
float volume = musicVolume - audioSource.volume;
audioSource.volume += volume > 0.02f ? 0.02f : volume;
}
else if (!isPlayMusic && audioSource.volume > 0)
{
audioSource.volume -= 0.02f;
if (audioSource.volume <= 0) audioSource.Stop();
}
}
/// <summary>
/// 꺄렴교쒼稜있
/// </summary>
public void PlayMusic(string name)
{
try {
if (string.IsNullOrEmpty(name))
return;
if (audioSource.clip != null && name == audioSource.clip.name)
return;
App.ResMgr.LoadAssetAsync<AudioClip>(name, (tmpName, clip) =>
{
if (clip == null || (nextBGM!=null && clip == nextBGM.audioClip))
{
App.ResMgr.UnLoadAsset(name);
return;
}
nextBGM = GetClip(clip);
});
}
catch(System.Exception e){
Debug.LogErrorFormat("PlayMusic error:{0}",e.ToString());
}
}
/// <summary>
/// 꺄렴稜槻
/// </summary>
/// <param name="name">Name.</param>
public void PlayAudio(string name)
{
if (string.IsNullOrEmpty(name))
return;
if (!isPlayAudio) return;
App.ResMgr.LoadAssetAsync<AudioClip>(name,(tmpName,clip) =>
{
if (clip == null)
{
App.ResMgr.UnLoadAsset(name);
return;
}
ExtAudioSource source = GetAudioSoure();
if (source.isPlaying) source.Stop();
source.volume = AduioVolume;
source.PlayOneShot(GetClip(clip));
});
}
/// <summary>
/// 삿혤寧몸audioClip
/// </summary>
/// <param name="audioClip"></param>
/// <returns></returns>
private ExtAudioClip GetClip(AudioClip audioClip) {
ExtAudioClip extAudioClip = audioClipPool.Get();
extAudioClip.Init(audioClip);
return extAudioClip;
}
/// <summary>
/// 쀼澗寧몸audioClip
/// </summary>
/// <param name="extAudioClip"></param>
private void ReleaseClip(ExtAudioClip extAudioClip) {
if (extAudioClip == null) return;
audioClipPool.Release(extAudioClip);
}
/// <summary>
/// 삿혤離빈寧몸稜槻꺄렴포
/// </summary>
/// <returns>The audio soure.</returns>
private ExtAudioSource GetAudioSoure()
{
ExtAudioSource source = null;
for (int i = 0; i < audioSources.Length; i++)
{
if (!audioSources[i].isPlaying)
source = audioSources[i];
}
source = source == null ? audioSources[0] : source;
ReleaseClip(source.clip);
return source;
}
/// <summary>
/// 界岺杰唐稜槻
/// </summary>
public void StopAllAudio()
{
if (audioSources != null)
{
for (int i = 0; i < audioSources.Length; i++)
{
if (audioSources[i] != null)
{
audioSources[i].Stop();
ReleaseClip(audioSources[i].clip);
}
}
}
}
public float MusicVolume
{
get {
return musicVolume;
}
set {
musicVolume = Mathf.Clamp01(value);
PlayerPrefs.SetFloat(MusicVolumeKey, musicVolume);
}
}
public float AduioVolume
{
get
{
return aduioVolume;
}
set
{
aduioVolume = Mathf.Clamp01(value);
PlayerPrefs.SetFloat(AudioVolumeKey, aduioVolume);
}
}
/// <summary>
/// 角뤠꺄렴稜있
/// </summary>
public bool IsPlayMusic
{
get
{
return isPlayMusic;
}
set
{
isPlayMusic = value;
PlayerPrefs.SetInt(IsPlayMusicKey, isPlayMusic ? 1 : 0);
}
}
/// <summary>
/// 角뤠꺄렴稜槻
/// </summary>
public bool IsPlayAudio
{
get
{
return isPlayAudio;
}
set
{
isPlayAudio = value;
PlayerPrefs.SetInt(IsPlayAudioKey, isPlayAudio ? 1 : 0);
if (!isPlayAudio)
StopAllAudio();
}
}
}
}